|
1 | 1 | using System; |
2 | 2 | using System.Collections.Concurrent; |
3 | 3 | using System.Collections.Generic; |
| 4 | +using System.Diagnostics; |
4 | 5 | using System.Linq; |
5 | 6 | using Microsoft.EntityFrameworkCore; |
| 7 | +using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; |
6 | 8 | using Microsoft.EntityFrameworkCore.Infrastructure; |
7 | 9 | using Microsoft.EntityFrameworkCore.Infrastructure.Internal; |
8 | 10 | using Microsoft.EntityFrameworkCore.Internal; |
@@ -155,16 +157,38 @@ public static object GetModelCacheSyncObject(this DbContext dbContext) |
155 | 157 |
|
156 | 158 | private static object sLock = new object(); |
157 | 159 |
|
| 160 | + |
| 161 | + public static IEnumerable<object> GetPrimaryKeyValues<TEntity>(TEntity entity,IKey primaryKey) where TEntity : class |
| 162 | + { |
| 163 | + return primaryKey.Properties.Select(o => entity.GetPropertyValue(o.Name)); |
| 164 | + } |
| 165 | + |
158 | 166 | public static TEntity GetAttachedEntity<TEntity>(this DbContext context, TEntity entity) where TEntity:class |
159 | 167 | { |
160 | 168 | if (entity == null) { throw new ArgumentNullException(nameof(entity)); } |
161 | | - |
162 | | - var primaryKeyValue = ShardingKeyUtil.GetPrimaryKeyValues(entity); |
| 169 | + var entityPrimaryKey = context.Model.FindEntityType(entity.GetType()).FindPrimaryKey(); |
| 170 | + var primaryKeyValue = GetPrimaryKeyValues(entity, entityPrimaryKey).ToArray(); |
163 | 171 | if (primaryKeyValue.IsEmpty()) |
164 | 172 | return null; |
165 | | - var entry = context.ChangeTracker.Entries<TEntity>().FirstOrDefault(e =>e.State != EntityState.Detached&&primaryKeyValue.SequenceEqual(ShardingKeyUtil.GetPrimaryKeyValues(e.Entity))); |
166 | | - |
167 | | - return entry?.Entity; |
| 173 | + var dbContextDependencies = (IDbContextDependencies)typeof(DbContext).GetTypePropertyValue(context, "DbContextDependencies"); |
| 174 | + var stateManager = dbContextDependencies.StateManager; |
| 175 | + |
| 176 | + //var entityIKey = ShardingKeyUtil.GetEntityIKey(entity); |
| 177 | + var internalEntityEntry = stateManager.TryGetEntry(entityPrimaryKey, primaryKeyValue); |
| 178 | + |
| 179 | + if (internalEntityEntry == null) |
| 180 | + return null; |
| 181 | + return (TEntity)internalEntityEntry.Entity; |
| 182 | + //sp.Restart(); |
| 183 | + |
| 184 | + //var entityEntries = context.ChangeTracker.Entries<TEntity>(); |
| 185 | + //sp.Stop(); |
| 186 | + //Console.WriteLine($"ChangeTracker.Entries:{sp.ElapsedMilliseconds}毫秒"); |
| 187 | + //sp.Restart(); |
| 188 | + //var entry = entityEntries.Where(e => e.State != EntityState.Detached && primaryKeyValue.SequenceEqual(ShardingKeyUtil.GetPrimaryKeyValues(e.Entity))).FirstOrDefault(); |
| 189 | + //sp.Stop(); |
| 190 | + //Console.WriteLine($"ChangeTracker.FirstOrDefault:{sp.ElapsedMilliseconds}毫秒"); |
| 191 | + //return entry?.Entity; |
168 | 192 | } |
169 | 193 |
|
170 | 194 | } |
|
0 commit comments