Beispiel #1
0
        /// <summary>
        ///     Initializes a new instance of the <see cref="UpdateEntryDto"/> class.
        /// </summary>
        /// <param name="entry">The state entry of an entity.</param>
        /// <param name="mapper">The <see cref="IDynamicObjectMapper" /> used for mapping the property values.</param>
        public UpdateEntryDto(IUpdateEntry entry, IDynamicObjectMapper mapper)
        {
            DynamicObject CreateValueDto(IProperty propertyBase, object value)
            {
                value = Utils.ConvertToProvider(value, propertyBase);
                return(mapper.MapObject(value));
            }

            this.EntityTypeName = entry.EntityType.DisplayName();
            this.EntityState    = entry.EntityState;
            this.PropertyDatas  = entry.ToEntityEntry().Properties.Select(
                prop => new PropertyData
            {
                Name             = prop.Metadata.Name,
                OriginalValueDto = prop.Metadata.GetOriginalValueIndex() >= 0 ? CreateValueDto(prop.Metadata, prop.OriginalValue) : null,
                CurrentValueDto  = CreateValueDto(prop.Metadata, prop.CurrentValue),
                IsModified       = prop.IsModified,
                IsTemporary      = prop.IsTemporary,
            }).ToList();

            if (entry.EntityType.HasDefiningNavigation())
            {
                var ownership = entry.EntityType.GetForeignKeys().Single(fk => fk.IsOwnership);
                this.DelegatedIdentityDatas = ownership.Properties.Select(
                    prop => new PropertyData
                {
                    Name             = prop.Name,
                    OriginalValueDto = CreateValueDto(prop, entry.GetOriginalValue(prop)),
                    CurrentValueDto  = CreateValueDto(prop, entry.GetCurrentValue(prop)),
                    IsModified       = entry.IsModified(prop),
                    IsTemporary      = entry.HasTemporaryValue(prop),
                }).ToList();
            }
        }
        public static WriteModel <TEntity> ToMongoDbWriteModel <TEntity>([NotNull] this IUpdateEntry updateEntry)
        {
            Check.NotNull(updateEntry, nameof(updateEntry));
            if (!typeof(TEntity).GetTypeInfo().IsAssignableFrom(updateEntry.EntityType.ClrType))
            {
                throw new InvalidOperationException($"Entity must derive from {nameof(TEntity)}.");
            }
            if (updateEntry.EntityState != EntityState.Added &&
                updateEntry.EntityState != EntityState.Modified &&
                updateEntry.EntityState != EntityState.Deleted)
            {
                throw new InvalidOperationException($"Entity state must be Added, Modified, or Deleted.");
            }

            WriteModel <TEntity> writeModel;

            switch (updateEntry.EntityState)
            {
            case EntityState.Added:
                writeModel = ToInsertModel <TEntity>(updateEntry as InternalEntityEntry);
                break;

            case EntityState.Modified:
                writeModel = new ReplaceOneModel <TEntity>(
                    GetIdFilter <TEntity>(updateEntry),
                    (TEntity)updateEntry.ToEntityEntry().Entity);
                break;

            default:
                writeModel = new DeleteOneModel <TEntity>(GetIdFilter <TEntity>(updateEntry));
                break;
            }
            return(writeModel);
        }
        /// <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 void Create(IUpdateEntry entry)
        {
            var key = CreateKey(entry);

            _docrows.Insert(BsonMapper.Global.ToDocument(entry.ToEntityEntry().Entity));
        }