覆盖SaveChangesAsync

Dan*_*nyT 7 c# asp.net entity-framework

有谁知道如何覆盖SaveChangesAsync?我知道张贴了类似的问题,但没有答案。我下面有以下代码:

public override async Task<int> SaveChangesAsync()
{
    PerformFurtherValidations();
    return await base.SaveChangesAsync();
}
Run Code Online (Sandbox Code Playgroud)

在生成过程中,我收到以下错误消息:

错误SaveChangesAsync():返回类型必须 System.Threading.Tasks.Task<int>与覆盖的成员匹配 System.Data.Entity.DbContext.SaveChangesAsync()

小智 7

public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
    return (await base.SaveChangesAsync(true, cancellationToken));
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,您不应该等待基本操作,而只需返回任务而不等待它。从 UI 线程调用并等待结果时,这可能会导致死锁。 (3认同)
  • 请提供有关您的解决方案的一些解释,而不仅仅是转储代码 (2认同)

pSt*_*tan 4

老问题,但我遇到了类似的问题并使用以下代码解决了它:

    public override async Task<int> SaveChangesAsync()
    {
        foreach (var history in this.ChangeTracker.Entries()
            .Where(e => e.Entity is IModificationHistory && (e.State == EntityState.Added ||
                e.State == EntityState.Modified))
            .Select(e => e.Entity as IModificationHistory)
            )
        {
            history.DateModified = DateTime.Now;
            if (history.DateCreated <= DateTime.MinValue)
            {
                history.DateCreated = DateTime.Now;
            }
        }
        int result = await base.SaveChangesAsync();
        foreach (var history in this.ChangeTracker.Entries()
                                        .Where(e => e.Entity is IModificationHistory)
                                        .Select(e => e.Entity as IModificationHistory))
        {
            history.IsDirty = false;
        }
        return  result;
    }
Run Code Online (Sandbox Code Playgroud)

自定义 SaveChangesAsync() 允许我调整脏标志、创建日期和修改日期。