public void Delegate_getter_is_cached_by_type_and_property_name() { var entityType = new EntityType(typeof(MyEntity)); var navigation = entityType.AddNavigation(new Navigation(Mock.Of <ForeignKey>(), "AsICollection")); var source = new ClrCollectionAccessorSource(); Assert.Same(source.GetAccessor(navigation), source.GetAccessor(navigation)); }
public void Delegate_getter_is_cached_by_type_and_property_name() { var entityType = new Model().AddEntityType(typeof(MyEntity)); var otherType = new Model().AddEntityType(typeof(MyOtherEntity)); var foreignKey = otherType.GetOrAddForeignKey(otherType.GetOrAddProperty("MyEntityId", typeof(int), shadowProperty: true), entityType.GetOrSetPrimaryKey(entityType.GetOrAddProperty("Id", typeof(int), shadowProperty: true))); var navigation = entityType.AddNavigation("AsICollection", foreignKey, pointsToPrincipal: false); var source = new ClrCollectionAccessorSource(new CollectionTypeFactory()); Assert.Same(source.GetAccessor(navigation), source.GetAccessor(navigation)); }
private void DoFixup(IForeignKey foreignKey, StateEntry principalEntry, StateEntry[] dependentEntries) { foreach (var navigation in _stateManager.Model.GetNavigations(foreignKey)) { if (navigation.EntityType == principalEntry.EntityType) { var accessor = _collectionAccessorSource.GetAccessor(navigation); foreach (var dependent in dependentEntries) { if (!accessor.Contains(principalEntry.Entity, dependent.Entity)) { accessor.Add(principalEntry.Entity, dependent.Entity); } } } else { var accessor = _setterSource.GetAccessor(navigation); foreach (var dependent in dependentEntries) { accessor.SetClrValue(dependent.Entity, principalEntry.Entity); } } } }
private object TryFindPrincipal(StateManager stateManager, INavigation navigation, object dependentEntity) { if (navigation.PointsToPrincipal) { return(_getterSource.GetAccessor(navigation).GetClrValue(dependentEntity)); } // TODO: Perf foreach (var principalEntry in stateManager.StateEntries .Where(e => e.EntityType == navigation.ForeignKey.ReferencedEntityType)) { if (navigation.IsCollection()) { if (_collectionAccessorSource.GetAccessor(navigation).Contains(principalEntry.Entity, dependentEntity)) { return(principalEntry.Entity); } } else if (_getterSource.GetAccessor(navigation).GetClrValue(principalEntry.Entity) == dependentEntity) { return(principalEntry.Entity); } } return(null); }
public void Navigation_is_returned_if_it_implements_IClrCollectionAccessor() { var accessorMock = new Mock <IClrCollectionAccessor>(); var navigationMock = accessorMock.As <INavigation>(); var source = new ClrCollectionAccessorSource(new CollectionTypeFactory()); Assert.Same(accessorMock.Object, source.GetAccessor(navigationMock.Object)); }
private void InitialFixup(StateEntry entry, EntityState oldState) { var entityType = entry.EntityType; foreach (var navigation in entityType.Navigations) { var navigationValue = entry[navigation]; if (navigationValue != null) { if (navigation.IsCollection()) { NavigationCollectionChangedAction( entry, navigation, ((IEnumerable)navigationValue).Cast <object>().ToList(), Enumerable.Empty <object>()); } else { NavigationReferenceChangedAction( entry, navigation, null, navigationValue); } } } var stateEntries = entry.StateManager.StateEntries.ToList(); // TODO: Perf on this state manager query foreach (var navigation in _model.Service.EntityTypes .SelectMany(e => e.Navigations) .Where(n => n.GetTargetType() == entityType)) { IClrCollectionAccessor collectionAccessor = null; if (navigation.IsCollection()) { collectionAccessor = _collectionAccessorSource.GetAccessor(navigation); } var navigationEntityType = navigation.EntityType; foreach (var relatedEntry in stateEntries) { if (relatedEntry.EntityType != navigationEntityType || relatedEntry == entry) { continue; } if (collectionAccessor != null) { if (collectionAccessor.Contains(relatedEntry.Entity, entry.Entity)) { NavigationCollectionChangedAction( relatedEntry, navigation, new[] { entry.Entity }, Enumerable.Empty <object>()); } } else { var navigationValue = relatedEntry[navigation]; if (navigationValue != null) { if (ReferenceEquals(navigationValue, entry.Entity)) { NavigationReferenceChangedAction( relatedEntry, navigation, null, navigationValue); } } } } } foreach (var foreignKey in entityType.ForeignKeys) { var principalEntry = entry.StateManager.GetPrincipal(entry.RelationshipsSnapshot, foreignKey); if (principalEntry != null) { DoFixup(foreignKey, principalEntry, new[] { entry }); } } foreach (var foreignKey in _model.Service.GetReferencingForeignKeys(entityType)) { var dependents = entry.StateManager.GetDependents(entry, foreignKey).ToArray(); if (dependents.Length > 0) { DoFixup(foreignKey, entry, dependents); } } }
private void LoadNavigationProperties( object entity, INavigation navigation, IReadOnlyList <object> relatedEntities) { if (navigation.PointsToPrincipal) { _clrPropertySetterSource .GetAccessor(navigation) .SetClrValue(entity, relatedEntities[0]); var inverseNavigation = navigation.TryGetInverse(); if (inverseNavigation != null) { if (inverseNavigation.IsCollection()) { _clrCollectionAccessorSource .GetAccessor(inverseNavigation) .AddRange(relatedEntities[0], new[] { entity }); } else { _clrPropertySetterSource .GetAccessor(inverseNavigation) .SetClrValue(relatedEntities[0], entity); } } } else { if (navigation.IsCollection()) { _clrCollectionAccessorSource .GetAccessor(navigation) .AddRange(entity, relatedEntities); var inverseNavigation = navigation.TryGetInverse(); if (inverseNavigation != null) { var clrPropertySetter = _clrPropertySetterSource .GetAccessor(inverseNavigation); foreach (var relatedEntity in relatedEntities) { clrPropertySetter.SetClrValue(relatedEntity, entity); } } } else { _clrPropertySetterSource .GetAccessor(navigation) .SetClrValue(entity, relatedEntities[0]); var inverseNavigation = navigation.TryGetInverse(); if (inverseNavigation != null) { _clrPropertySetterSource .GetAccessor(inverseNavigation) .SetClrValue(relatedEntities[0], entity); } } } }