Skip to content

Commit e3c618f

Browse files
author
zzzprojects
committed
Fix to v1.6.12
Fix to v1.6.12
1 parent 3a555ac commit e3c618f

File tree

7 files changed

+138
-3
lines changed

7 files changed

+138
-3
lines changed

src/shared/Z.EF.Plus.Audit.Shared/Audit.cs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,16 @@
77

88
using System;
99
using System.Collections.Generic;
10-
#if EF5 || EF6
10+
#if EF5
1111
using System.Data.Entity;
12-
12+
using System.Data.Objects;
13+
using System.Reflection;
14+
using System.Linq.Expressions;
15+
#elif EF6
16+
using System.Data.Entity;
17+
using System.Data.Entity.Core.Objects;
18+
using System.Reflection;
19+
using System.Linq.Expressions;
1320
#elif EFCORE
1421
using Microsoft.EntityFrameworkCore;
1522

@@ -47,6 +54,55 @@ public Audit()
4754
}
4855
}
4956

57+
#if EF5 || EF6
58+
59+
private static Func<ObjectStateEntry, object> RelationshipEntryKey0;
60+
private static Func<ObjectStateEntry, object> RelationshipEntryKey1;
61+
62+
public static object GetRelationshipEntryKey0(ObjectStateEntry entry)
63+
{
64+
var relationshipEntryType = typeof(ObjectStateEntry).Assembly.GetType("System.Data.Entity.Core.Objects.RelationshipEntry");
65+
66+
if (RelationshipEntryKey0 == null)
67+
{
68+
// Parameter
69+
var parameter = Expression.Parameter(typeof(ObjectStateEntry));
70+
71+
// Convert
72+
var parameterConvert = Expression.Convert(parameter, relationshipEntryType);
73+
74+
var key0Property = entry.GetType().GetProperty("Key0", BindingFlags.NonPublic | BindingFlags.Instance);
75+
var getKey0 = Expression.Property(parameterConvert, key0Property);
76+
77+
RelationshipEntryKey0 = Expression.Lambda<Func<ObjectStateEntry, object>>(getKey0, parameter).Compile();
78+
}
79+
80+
return RelationshipEntryKey0(entry);
81+
}
82+
83+
public static object GetRelationshipEntryKey1(ObjectStateEntry entry)
84+
{
85+
var relationshipEntryType = typeof(ObjectStateEntry).Assembly.GetType("System.Data.Entity.Core.Objects.RelationshipEntry");
86+
87+
if (RelationshipEntryKey1 == null)
88+
{
89+
// Parameter
90+
var parameter = Expression.Parameter(typeof(ObjectStateEntry));
91+
92+
// Convert
93+
var parameterConvert = Expression.Convert(parameter, relationshipEntryType);
94+
95+
var key0Property = entry.GetType().GetProperty("Key1", BindingFlags.NonPublic | BindingFlags.Instance);
96+
var getKey0 = Expression.Property(parameterConvert, key0Property);
97+
98+
RelationshipEntryKey1 = Expression.Lambda<Func<ObjectStateEntry, object>>(getKey0, parameter).Compile();
99+
}
100+
101+
return RelationshipEntryKey1(entry);
102+
}
103+
#endif
104+
105+
50106
/// <summary>Gets or sets the entries.</summary>
51107
/// <value>The entries.</value>
52108
public List<AuditEntry> Entries { get; set; }

src/shared/Z.EF.Plus.Audit.Shared/Audit/AuditRelationshipAdded.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static void AuditRelationAdded(Audit audit, EntityEntry objectStateEntry)
5252
#endif
5353
{
5454
var values = objectStateEntry.CurrentValues;
55-
55+
5656
var leftKeys = (EntityKey) values.GetValue(0);
5757
var rightKeys = (EntityKey) values.GetValue(1);
5858

src/shared/Z.EF.Plus.Audit.Shared/Audit/PreSaveChanges.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,25 @@ public static void PreSaveChanges(Audit audit, DbContext context)
4646
// Relationship
4747
if (objectStateEntry.IsRelationship)
4848
{
49+
var leftKey = GetRelationshipEntryKey0(objectStateEntry);
50+
var rightKey = GetRelationshipEntryKey1(objectStateEntry);
51+
52+
var leftEntity = objectContext.ObjectStateManager.GetObjectStateEntry(leftKey);
53+
var rightEntity = objectContext.ObjectStateManager.GetObjectStateEntry(rightKey);
54+
55+
var leftIsAudited = audit.CurrentOrDefaultConfiguration.IsAuditedEntity(leftEntity);
56+
var rightIsAudited = audit.CurrentOrDefaultConfiguration.IsAuditedEntity(rightEntity);
57+
58+
if(audit.CurrentOrDefaultConfiguration.ExcludeRelationshipIfOneExcluded
59+
&& (!leftIsAudited || !rightIsAudited))
60+
{
61+
continue;
62+
}
63+
else if(!leftIsAudited && !rightIsAudited)
64+
{
65+
continue;
66+
}
67+
4968
// Relationship Added
5069
if (objectStateEntry.State == EntityState.Added
5170
&& !audit.CurrentOrDefaultConfiguration.IgnoreRelationshipAdded)

src/shared/Z.EF.Plus.Audit.Shared/AuditConfiguration.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ public AuditConfiguration()
123123
/// <value>A dictionary of value formatter for a property name.</value>
124124
public ConcurrentDictionary<string, Func<object, object>> ValueFormatterDictionary { get; set; }
125125

126+
/// <summary>
127+
/// Gets or sets a value indicating whether the exclude relationship if one excluded.
128+
/// </summary>
129+
/// <value>True if exclude relationship if one excluded, false if not.</value>
130+
public bool ExcludeRelationshipIfOneExcluded { get; set; }
131+
126132
#if EF5 || EF6
127133
/// <summary>
128134
/// Gets or sets a value indicating whether null value should be used in the Audit instead of DBNull.Value
@@ -156,6 +162,7 @@ public AuditConfiguration Clone()
156162
ExcludeIncludePropertyPredicates = new List<Func<object, string, bool?>>(ExcludeIncludePropertyPredicates),
157163
SoftAddedPredicates = new List<Func<object, bool>>(SoftAddedPredicates),
158164
SoftDeletedPredicates = new List<Func<object, bool>>(SoftDeletedPredicates),
165+
ExcludeRelationshipIfOneExcluded = ExcludeRelationshipIfOneExcluded,
159166
#if EF5 || EF6
160167
UseNullForDBNullValue = UseNullForDBNullValue
161168
#endif

src/shared/Z.EF.Plus.BatchUpdate.Shared/BatchUpdate.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
using System.Text.RegularExpressions;
1515
#if EF5
1616
using System.Data.Objects;
17+
using System.Data.SqlClient;
1718
using Z.EntityFramework.Plus.Internal.Core.SchemaObjectModel;
1819

1920
#elif EF6
2021
using System.Data.Entity.Core.Objects;
2122
using System.Data.Entity.Infrastructure.Interception;
23+
using System.Data.SqlClient;
2224
using Z.EntityFramework.Plus.Internal.Core.SchemaObjectModel;
2325

2426
#elif EFCORE
@@ -473,6 +475,15 @@ internal DbCommand CreateCommand<T>(ObjectQuery query, SchemaEntityType<T> entit
473475
var parameter = command.CreateParameter();
474476
parameter.ParameterName = parameterPrefix + "zzz_BatchUpdate_" + i;
475477
parameter.Value = values[i].Item2 ?? DBNull.Value;
478+
479+
if(parameter is SqlParameter)
480+
{
481+
var sqlParameter = (SqlParameter)parameter;
482+
if(sqlParameter.DbType == DbType.DateTime)
483+
{
484+
sqlParameter.DbType = DbType.DateTime2;
485+
}
486+
}
476487
command.Parameters.Add(parameter);
477488
}
478489

src/shared/Z.EF.Plus._Core.Shared/EF/DbParameter/DbParameter.CopyFrom.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99

1010
using System;
1111
using System.Data.Common;
12+
using System.Reflection;
1213

1314
#if EF5
1415
using System.Data.Objects;
16+
#elif EF6
1517
#elif EFCORE
1618
using Microsoft.EntityFrameworkCore.Storage;
1719
#endif
@@ -22,23 +24,49 @@ internal static partial class InternalExtensions
2224
{
2325
public static void CopyFrom(this DbParameter @this, DbParameter from)
2426
{
27+
#if NETSTANDARD
28+
var fullName = @this.GetType().GetTypeInfo().FullName;
29+
#else
30+
var fullName = @this.GetType().FullName;
31+
#endif
2532
@this.DbType = from.DbType;
2633
@this.Direction = from.Direction;
2734
@this.IsNullable = from.IsNullable;
2835
@this.ParameterName = from.ParameterName;
2936
@this.Size = from.Size;
3037

38+
#if EF6
39+
if(fullName.Contains("Oracle") && from.GetType().GetProperty("OracleDbType") != null)
40+
{
41+
var property = from.GetType().GetProperty("OracleDbType");
42+
property.SetValue(@this, property.GetValue(from, null), new object[0]);
43+
}
44+
#endif
45+
3146
@this.Value = from.Value ?? DBNull.Value;
3247
}
3348

3449
public static void CopyFrom(this DbParameter @this, DbParameter from, string newParameterName)
3550
{
51+
#if NETSTANDARD
52+
var fullName = @this.GetType().GetTypeInfo().FullName;
53+
#else
54+
var fullName = @this.GetType().FullName;
55+
#endif
3656
@this.DbType = from.DbType;
3757
@this.Direction = from.Direction;
3858
@this.IsNullable = from.IsNullable;
3959
@this.ParameterName = newParameterName;
4060
@this.Size = from.Size;
4161

62+
#if EF6
63+
if (fullName.Contains("Oracle") && from.GetType().GetProperty("OracleDbType") != null)
64+
{
65+
var property = from.GetType().GetProperty("OracleDbType");
66+
property.SetValue(@this, property.GetValue(from, null), new object[0]);
67+
}
68+
#endif
69+
4270
@this.Value = from.Value ?? DBNull.Value;
4371
}
4472

src/shared/Z.EF.Plus._Core.Shared/EFCore/IQueryable`/GetInMemoryContext.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ public static DbContext GetInMemoryContext<T>(this IQueryable<T> source)
2727
var queryContextFactory = queryContextFactoryField.GetValue(compiler);
2828

2929
#if EFCORE
30+
#if NETSTANDARD2_0
31+
var dependenciesProperty = typeof(QueryContextFactory).GetProperty("Dependencies", BindingFlags.NonPublic | BindingFlags.Instance);
32+
var dependencies = dependenciesProperty.GetValue(queryContextFactory);
33+
34+
var stateManagerField = dependencies.GetType().GetProperty("StateManager", BindingFlags.Public | BindingFlags.Instance);
35+
var stateManagerDynamic = stateManagerField.GetValue(dependencies);
36+
37+
IStateManager stateManager = stateManagerDynamic as IStateManager;
38+
if (stateManager == null)
39+
{
40+
stateManager = ((dynamic)stateManagerDynamic).Value;
41+
}
42+
#else
3043
var stateManagerField = typeof(QueryContextFactory).GetProperty("StateManager", BindingFlags.NonPublic | BindingFlags.Instance);
3144
var stateManagerDynamic = stateManagerField.GetValue(queryContextFactory);
3245

@@ -35,6 +48,7 @@ public static DbContext GetInMemoryContext<T>(this IQueryable<T> source)
3548
{
3649
stateManager = ((dynamic) stateManagerDynamic).Value;
3750
}
51+
#endif
3852
#else
3953
var stateManagerField = typeof (QueryContextFactory).GetField("_stateManager", BindingFlags.NonPublic | BindingFlags.Instance);
4054
var stateManager = (IStateManager) stateManagerField.GetValue(queryContextFactory);

0 commit comments

Comments
 (0)