Exemplo n.º 1
0
        public void Write(IDbEntityCollection <TEntity> entityCollection)
        {
            var writeModel = BuildWriteModel(entityCollection);

            if (writeModel.Any())
            {
                //TODO: Add support for Transactions with MongoDB Server 4.0
                GetCollection().BulkWrite(writeModel);
            }
        }
Exemplo n.º 2
0
        public async Task WriteAsync(IDbEntityCollection <TEntity> entityCollection, CancellationToken cancellationToken = default(CancellationToken))
        {
            var writeModel = BuildWriteModel(entityCollection);

            cancellationToken.ThrowIfCancellationRequested();

            if (writeModel.Any())
            {
                //TODO: Add support for Transactions with MongoDB Server 4.0
                await GetCollection().BulkWriteAsync(writeModel, null, cancellationToken).ConfigureAwait(false);
            }
        }
Exemplo n.º 3
0
        private IEnumerable <WriteModel <TEntity> > BuildWriteModel(IDbEntityCollection <TEntity> entityCollection)
        {
            var idFieldName = EntityMapper.GetIdName();
            var writeModel  = new List <WriteModel <TEntity> >();

            foreach (var entry in entityCollection.GetEntries())
            {
                if (entry.State == DbEntityEntryState.Added)
                {
                    EntityMutation <TEntity> .MutateEntity(entry.Entity, MutatorType.Insert, Database);

                    writeModel.Add(new InsertOneModel <TEntity>(entry.Entity));
                }
                else if (entry.State == DbEntityEntryState.Updated)
                {
                    EntityMutation <TEntity> .MutateEntity(entry.Entity, MutatorType.Update, Database);

                    var idFieldValue = EntityMapper.GetIdValue(entry.Entity);
                    var filter       = Builders <TEntity> .Filter.Eq(idFieldName, idFieldValue);

                    var updateDefintion = UpdateDefinitionHelper.CreateFromDiff <TEntity>(entry.OriginalValues, entry.CurrentValues);

                    //MongoDB doesn't like it if an UpdateDefinition is empty.
                    //This is primarily to work around a mutation that may set an entity to its default state.
                    if (updateDefintion.HasChanges())
                    {
                        writeModel.Add(new UpdateOneModel <TEntity>(filter, updateDefintion));
                    }
                }
                else if (entry.State == DbEntityEntryState.Deleted)
                {
                    var idFieldValue = EntityMapper.GetIdValue(entry.Entity);
                    var filter       = Builders <TEntity> .Filter.Eq(idFieldName, idFieldValue);

                    writeModel.Add(new DeleteOneModel <TEntity>(filter));
                }
            }

            return(writeModel);
        }