EF Core Savechanges не работает для удаления - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь удалить дочерний элемент (ы) из моего домена, но Savechanges () не работает и не произошло никаких исключений, и я отслеживаю и нахожу свою сущность в Dbcontext, состояние которой изменилось на измененное. добавить или обновить работает правильно. все работало нормально, прежде чем я добавляю интерфейс IEventbus для публикации события. мой метод удаления в классе домена.

 public void RemoveItem(Guid id, IEventBus eventBus)
    {
        if (!string.IsNullOrWhiteSpace(this.Confirmer.UserId))
        {
            throw new RemoveItemOfConfirmedScrapException();
        }

        var scrapItem = this.ScrapItems.First(p => p.Id == id);

        var assetId = scrapItem.AssetId;


        this.ScrapItems.Remove(this.ScrapItems.First(p => p.Id == id));


          eventBus.Publish(new ScrapItemRemovedEvent(assetId));
    }

, и это мой UnitOfWork для сохранения в базе данных.

 public class UnitOfWork : IUnitWork
{
    private readonly IDbContext dbContext;

    private DbContextBase dbContextBase;
    public UnitOfWork(IDbContext dbContext)
    {
        this.dbContext = dbContext;

        this.dbContextBase = dbContext as DbContextBase;
    }

    public void Commit()
    {
        try
        {
            this.dbContext.SaveChanges();
        }
        catch
        {

            RollBack();
            throw;
        }

    }
    public void RollBack()
    {
        this.dbContextBase.ChangeTracker.Entries()
            .Where(e => e.Entity != null).ToList()
            .ForEach(e => e.State = EntityState.Detached);
    }
}

то, что происходит с этим удалением, работает в других доменах, даже в родительской сущностино в этом случае не удалять в базе данных. и ChangeTracker показывает, что определенное состояние объекта изменилось на «измененное», но без каких-либо исключений завершить задание и не повлияло на базу данных.

У меня есть прикладной сервисный уровень с шаблоном оформления украшения, который вызывает UnitOfWork

     public void Dispatch<TCommand>(TCommand command)
        where TCommand : Command
    {
        var commandHandler = this.diContainer.Resolve<ICommandHandler<TCommand>>();
        var transactionCommandHandler = new TransactionalCommandHandler<TCommand>(commandHandler, this.diContainer);
        var logCommandHandler = new LogCommandHandler<TCommand>(transactionCommandHandler);
        logCommandHandler.Execute(command);
    }

и транзакционный класс, который вызывает UnitOfWork

    public class TransactionalCommandHandler<TCommand> : ICommandHandler<TCommand>
    where TCommand : Command
{
    private readonly ICommandHandler<TCommand> commandHandler;

    private readonly IDiContainer container;

    public TransactionalCommandHandler(ICommandHandler<TCommand> commandHandler, IDiContainer container)
    {
        this.commandHandler = commandHandler;
        this.container = container;
    }

    public void Execute(TCommand command)
    {
        var unitOfWork = this.container.Resolve<IUnitWork>(); // ServiceLocator.Current.Resolve<IUnitWork>();

        try
        {
            this.commandHandler.Execute(command);
            unitOfWork.Commit();
        }
        catch (Exception e)
        {
           unitOfWork.RollBack();
            throw;
        }


    }
}

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Очень простая небрежность вызвала эту проблему. в моей команде фасад есть область транзакции, что забыл поставить "scope.complete ()"

    public void DeleteScrapItem(DeleteScrapItemCommand command)
    {

        using (var scope = new TransactionScope())
        {
            Action<dynamic> updateAssetStatus = p => this.CommandBus.Dispatch(new UpdateAssetStatusCommand()
            {
                AssetId = p.AssetId,
                Status = 0
            });

            this.eventBus.Subscribe<ScrapItemRemovedEvent>(updateAssetStatus);

            this.CommandBus.Dispatch(command);

            scope.Complete(); // forgot put this ...
        }
    }
0 голосов
/ 11 ноября 2019
    var scrapItem = this.ScrapItems.First(p => p.Id == id);
    var assetId = scrapItem.AssetId;
    this.ScrapItems.Remove(scrapItem);
    this.Commit(); // you weren't committing before

Удаление объекта из коллекции только помечает его состояние как Удаленное. Вам необходимо вызвать метод SaveChanges, чтобы отразить изменения в базе данных.

...