public virtual IEnumerable <InternalEntityEntry> GetDependents(InternalEntityEntry principalEntry, IForeignKey foreignKey) { var principalKeyValue = principalEntry.GetPrincipalKeyValue(foreignKey); // TODO: Perf: Add additional indexes so that this isn't a linear lookup return(principalKeyValue == EntityKey.InvalidEntityKey ? Enumerable.Empty <InternalEntityEntry>() : Entries.Where( e => foreignKey.DeclaringEntityType.IsAssignableFrom(e.EntityType) && principalKeyValue.Equals(e.GetDependentKeyValue(foreignKey)))); }
private EntityKey GetKeyValueChecked(IKey key, InternalEntityEntry entry) { var keyValue = entry.GetPrincipalKeyValue(key); if (keyValue == EntityKey.InvalidEntityKey) { // TODO: Check message text here throw new InvalidOperationException(CoreStrings.InvalidPrimaryKey(entry.EntityType.Name)); } return(keyValue); }
public virtual IEnumerable <InternalEntityEntry> GetDependents(InternalEntityEntry principalEntry, IForeignKey foreignKey) { var keyValue = principalEntry.GetPrincipalKeyValue(foreignKey); Dictionary <EntityKey, HashSet <InternalEntityEntry> > fkMap; HashSet <InternalEntityEntry> dependents; return(keyValue != EntityKey.InvalidEntityKey && _dependentsMap.TryGetValue(foreignKey, out fkMap) && fkMap.TryGetValue(keyValue, out dependents) ? dependents : Enumerable.Empty <InternalEntityEntry>()); }
public virtual void StopTracking(InternalEntityEntry entry) { var mapKey = entry.Entity ?? entry; _entityReferenceMap.Remove(mapKey); _detachedEntityReferenceMap[mapKey] = new WeakReference <InternalEntityEntry>(entry); foreach (var key in entry.EntityType.GetKeys()) { var keyValue = entry.GetPrincipalKeyValue(key); InternalEntityEntry existingEntry; if (_identityMap.TryGetValue(keyValue, out existingEntry) && existingEntry == entry) { _identityMap.Remove(keyValue); } } foreach (var foreignKey in entry.EntityType.GetForeignKeys()) { var dependentKey = entry.GetDependentKeyValue(foreignKey); Dictionary <EntityKey, HashSet <InternalEntityEntry> > fkMap; HashSet <InternalEntityEntry> dependents; if (dependentKey != EntityKey.InvalidEntityKey && _dependentsMap.TryGetValue(foreignKey, out fkMap) && fkMap.TryGetValue(dependentKey, out dependents)) { dependents.Remove(entry); if (dependents.Count == 0) { fkMap.Remove(dependentKey); if (fkMap.Count == 0) { _dependentsMap.Remove(foreignKey); } } } } }
private void AddToIdentityMap(IEntityType entityType, EntityKey entityKey, InternalEntityEntry newEntry) { _identityMap.Add(entityKey, newEntry); foreach (var key in entityType.GetKeys().Where(k => k != entityKey.Key)) { var principalKeyValue = newEntry.GetPrincipalKeyValue(key); if (principalKeyValue != EntityKey.InvalidEntityKey) { _identityMap[principalKeyValue] = newEntry; } } foreach (var foreignKey in entityType.GetForeignKeys()) { var dependentKey = newEntry.GetDependentKeyValue(foreignKey); if (dependentKey == EntityKey.InvalidEntityKey) { continue; } Dictionary <EntityKey, HashSet <InternalEntityEntry> > fkMap; if (!_dependentsMap.TryGetValue(foreignKey, out fkMap)) { fkMap = new Dictionary <EntityKey, HashSet <InternalEntityEntry> >(); _dependentsMap[foreignKey] = fkMap; } HashSet <InternalEntityEntry> dependents; if (!fkMap.TryGetValue(dependentKey, out dependents)) { dependents = new HashSet <InternalEntityEntry>(); fkMap[dependentKey] = dependents; } dependents.Add(newEntry); } }
public virtual IEnumerable<InternalEntityEntry> GetDependents(InternalEntityEntry principalEntry, IForeignKey foreignKey) { var keyValue = principalEntry.GetPrincipalKeyValue(foreignKey); Dictionary<EntityKey, HashSet<InternalEntityEntry>> fkMap; HashSet<InternalEntityEntry> dependents; return keyValue != EntityKey.InvalidEntityKey && _dependentsMap.TryGetValue(foreignKey, out fkMap) && fkMap.TryGetValue(keyValue, out dependents) ? dependents : Enumerable.Empty<InternalEntityEntry>(); }
private EntityKey GetKeyValueChecked(IKey key, InternalEntityEntry entry) { var keyValue = entry.GetPrincipalKeyValue(key); if (keyValue == EntityKey.InvalidEntityKey) { // TODO: Check message text here throw new InvalidOperationException(CoreStrings.InvalidPrimaryKey(entry.EntityType.Name)); } return keyValue; }
public virtual void StopTracking(InternalEntityEntry entry) { var mapKey = entry.Entity ?? entry; _entityReferenceMap.Remove(mapKey); _detachedEntityReferenceMap[mapKey] = new WeakReference<InternalEntityEntry>(entry); foreach (var key in entry.EntityType.GetKeys()) { var keyValue = entry.GetPrincipalKeyValue(key); InternalEntityEntry existingEntry; if (_identityMap.TryGetValue(keyValue, out existingEntry) && existingEntry == entry) { _identityMap.Remove(keyValue); } } foreach (var foreignKey in entry.EntityType.GetForeignKeys()) { var dependentKey = entry.GetDependentKeyValue(foreignKey); Dictionary<EntityKey, HashSet<InternalEntityEntry>> fkMap; HashSet<InternalEntityEntry> dependents; if (dependentKey != EntityKey.InvalidEntityKey && _dependentsMap.TryGetValue(foreignKey, out fkMap) && fkMap.TryGetValue(dependentKey, out dependents)) { dependents.Remove(entry); if (dependents.Count == 0) { fkMap.Remove(dependentKey); if (fkMap.Count == 0) { _dependentsMap.Remove(foreignKey); } } } } }
private void AddToIdentityMap(IEntityType entityType, EntityKey entityKey, InternalEntityEntry newEntry) { _identityMap.Add(entityKey, newEntry); foreach (var key in entityType.GetKeys().Where(k => k != entityKey.Key)) { var principalKeyValue = newEntry.GetPrincipalKeyValue(key); if (principalKeyValue != EntityKey.InvalidEntityKey) { _identityMap[principalKeyValue] = newEntry; } } foreach (var foreignKey in entityType.GetForeignKeys()) { var dependentKey = newEntry.GetDependentKeyValue(foreignKey); if (dependentKey == EntityKey.InvalidEntityKey) { continue; } Dictionary<EntityKey, HashSet<InternalEntityEntry>> fkMap; if (!_dependentsMap.TryGetValue(foreignKey, out fkMap)) { fkMap = new Dictionary<EntityKey, HashSet<InternalEntityEntry>>(); _dependentsMap[foreignKey] = fkMap; } HashSet<InternalEntityEntry> dependents; if (!fkMap.TryGetValue(dependentKey, out dependents)) { dependents = new HashSet<InternalEntityEntry>(); fkMap[dependentKey] = dependents; } dependents.Add(newEntry); } }
public virtual IEnumerable<InternalEntityEntry> GetDependents(InternalEntityEntry principalEntry, IForeignKey foreignKey) { var principalKeyValue = principalEntry.GetPrincipalKeyValue(foreignKey); // TODO: Perf: Add additional indexes so that this isn't a linear lookup return principalKeyValue == EntityKey.InvalidEntityKey ? Enumerable.Empty<InternalEntityEntry>() : Entries.Where( e => e.EntityType == foreignKey.EntityType && principalKeyValue.Equals(e.GetDependentKeyValue(foreignKey))); }