Beispiel #1
0
        public virtual InternalEntityEntry StartTrackingFromQuery(
            IEntityType baseEntityType,
            object entity,
            ValueBuffer valueBuffer)
        {
            var existingEntry = TryGetEntry(entity);

            if (existingEntry != null)
            {
                return(existingEntry);
            }

            var clrType = entity.GetType();

            var newEntry = _factory.Create(this,
                                           baseEntityType.ClrType == clrType
                    ? baseEntityType
                    : _model.FindEntityType(clrType),
                                           entity, valueBuffer);

            foreach (var key in baseEntityType.GetKeys())
            {
                GetOrCreateIdentityMap(key).AddOrUpdate(newEntry);
            }

            _entityReferenceMap[entity] = newEntry;

            newEntry.MarkUnchangedFromQuery();

            _subscriber.SnapshotAndSubscribe(newEntry);

            return(newEntry);
        }
Beispiel #2
0
        public virtual InternalEntityEntry CreateNewEntry(IEntityType entityType)
        {
            // TODO: Consider entities without parameterless constructor--use o/c mapping info?
            // Issue #240
            var entity = entityType.HasClrType() ? Activator.CreateInstance(entityType.ClrType) : null;

            return(_subscriber.SnapshotAndSubscribe(_factory.Create(this, entityType, entity)));
        }
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public virtual InternalEntityEntry StartTrackingFromQuery(
            IEntityType baseEntityType,
            object entity,
            ValueBuffer valueBuffer,
            ISet <IForeignKey> handledForeignKeys)
        {
            var existingEntry = TryGetEntry(entity);

            if (existingEntry != null)
            {
                return(existingEntry);
            }

            var clrType = entity.GetType();

            var newEntry = _internalEntityEntryFactory.Create(
                this,
                baseEntityType.ClrType == clrType
                    ? baseEntityType
                    : _model.FindRuntimeEntityType(clrType),
                entity, valueBuffer);

            foreach (var key in baseEntityType.GetKeys())
            {
                GetOrCreateIdentityMap(key).AddOrUpdate(newEntry);
            }

            AddToReferenceMap(newEntry);

            newEntry.MarkUnchangedFromQuery(handledForeignKeys);

            if (_internalEntityEntrySubscriber.SnapshotAndSubscribe(newEntry))
            {
                _needsUnsubscribe = true;
            }

            return(newEntry);
        }
Beispiel #4
0
        public virtual InternalEntityEntry GetOrCreateEntry(object entity)
        {
            // TODO: Consider how to handle derived types that are not explicitly in the model
            // Issue #743
            var entry = TryGetEntry(entity);

            if (entry == null)
            {
                if (_detachedEntityReferenceMap.Count % 100 == 99)
                {
                    InternalEntityEntry _;
                    var deadKeys = _detachedEntityReferenceMap
                                   .Where(e => !e.Value.TryGetTarget(out _))
                                   .Select(e => e.Key)
                                   .ToList();

                    foreach (var deadKey in deadKeys)
                    {
                        _detachedEntityReferenceMap.Remove(deadKey);
                    }
                }

                SingleQueryMode = false;

                var entityType = _model.FindEntityType(entity.GetType());

                if (entityType == null)
                {
                    throw new InvalidOperationException(CoreStrings.EntityTypeNotFound(entity.GetType().DisplayName(false)));
                }

                entry = _subscriber.SnapshotAndSubscribe(_factory.Create(this, entityType, entity));

                _detachedEntityReferenceMap[entity] = new WeakReference <InternalEntityEntry>(entry);
            }
            return(entry);
        }