We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
In short I want to do this:
object[] keys = ....; dbContext.Set<TEntity>().Local.Find(keys) //or dbContext.ChangeTracker.Entries<TEntity>().Find(keys);
or
bool EqualsByPK(TEntity entity1, TEntity entity2);
resolve duplicates as described in the change-tracking/identity-resolution docs.
In other words, find out, whether entity with specified key is already tracked:
context.ChangeTracker.TrackGraph(entity, node => { var entityType = node.Entry.Metadata; //documented way is not generic because of hard code Id property //var keyValue = node.Entry.Property("Id").CurrentValue; //hard coded ID //var existingEntity = node.Entry.Context.ChangeTracker.Entries() // .FirstOrDefault( // e => Equals(e.Metadata, entityType) // && Equals(e.Property("Id").CurrentValue, keyValue)); //hard coded ID object[] keyValues = entityType.GetKeyValues(node.Entry.Entity); //new api //object[] keyValues = entityType.GetKeys() // .FirstOrDefault(key => key.IsPrimaryKey())?.Properties // .Select(property => node.Entry.CurrentValues[property]) // .ToArray(); var predicate = entityType.CreatePrimaryKeyPredicate(keyValues); //new API .dbContext.ChangeTracker.Entries().Where(e => Equals(e.Metadata, entityType)) .FirstOrDefault(e => predicate(e.Entity)); var existingEntity = dbContext.ChangeTracker.Entries().FirstOrDefault(predicate); if (existingEntity == null) { Console.WriteLine($"Tracking {entityType.DisplayName()} entity with key value {keyValue}"); node.Entry.State = EntityState.Modified; } else { Console.WriteLine($"Discarding duplicate {entityType.DisplayName()} entity with key value {keyValue}"); } });
Proposed solution:
new APIs:
object[] GetKeyValues(this IEntityType entityType, object Entity);
Func<bool, object>(this IEntityType entityType, entityType.CreatePrimaryKeyPredicate(keyValues))
object[] keyValues = entityType.GetKeyValues(node.Entry.Entity); //object[] keyValues = entityType.GetKeys() // .FirstOrDefault(key => key.IsPrimaryKey())?.Properties // .Select(property => node.Entry.CurrentValues[property]) // .ToArray(); var predicate = entityType.CreatePrimaryKeyPredicate(keyValues); dbContext.ChangeTracker.Entries().Where(e => Equals(e.Metadata, entityType)) .FirstOrDefault(predicate);
The text was updated successfully, but these errors were encountered:
Duplicate of #7391.
Sorry, something went wrong.
No branches or pull requests
Problems I'm trying to solve
In short I want to do this:
or
or
resolve duplicates as described in the change-tracking/identity-resolution docs.
In other words, find out, whether entity with specified key is already tracked:
Proposed solution:
new APIs:
object[] GetKeyValues(this IEntityType entityType, object Entity);
Func<bool, object>(this IEntityType entityType, entityType.CreatePrimaryKeyPredicate(keyValues))
object[] keyValues = entityType.GetKeyValues(node.Entry.Entity);
//object[] keyValues = entityType.GetKeys()
// .FirstOrDefault(key => key.IsPrimaryKey())?.Properties
// .Select(property => node.Entry.CurrentValues[property])
// .ToArray();
var predicate = entityType.CreatePrimaryKeyPredicate(keyValues);
dbContext.ChangeTracker.Entries().Where(e => Equals(e.Metadata, entityType))
.FirstOrDefault(predicate);
The text was updated successfully, but these errors were encountered: