EF Core Savechanges 不适用于 Remove

EF Core Savechanges not working for Remove

我正在尝试从我的域中删除子项,但 Savechanges() 不工作并且没有发生异常,我正在跟踪并在 Dbcontext 中找到我的实体,状态更改为已修改。添加或更新工作正常。在我添加 IEventbus 接口以发布事件之前,一切正常。我在域 class.

中的删除方法
 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));
    }

这是我保存在数据库中的工作单元。

 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 显示特定实体状态更改为 "modified" 但没有任何异常完成作业并且不影响数据库。

我有一个带有装饰设计模式的应用程序服务层来调用 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

的事务性 class
    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;
        }


    }
}
    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 方法才能将更改反映到数据库中。

一个非常简单的粗心导致了这个问题。 在我的命令外观中,事务范围忘记了 "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 ...
        }
    }