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));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
        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);
                }
            }
        }
Ejemplo n.º 7
0
        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);
                    }
                }
            }
        }