gpt4 book ai didi

c# - EF Core > 删除实体(软删除)> 实体状态保持不变

转载 作者:行者123 更新时间:2023-12-04 01:08:21 24 4
gpt4 key购买 nike

在我的通用基础存储库中,我有以下用于从数据库中删除实体的简单方法:

    public async Task<bool> DeleteAsync(TKey id)
{
var item = await Context.Set<TDb>().FindAsync(id).ConfigureAwait(false);
if (item == null)
return null;

var result = Context.Set<TDb>().Remove(item);
await Context.SaveChangesAsync().ConfigureAwait(false);

return result.State == EntityState.Modified || result.State == EntityState.Deleted;
}

然后在我的数据库上下文中,我确实以下列方式在我的保存更改异步中设置影子属性(就像微软建议的那样)(为更清晰起见简化了代码):

public class EfCoreDbContext : DbContext, IUnitOfWork
{
public EfCoreDbContext(
DbContextOptions options
IConfiguration configuration) : base(options)
{
}

public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
ChangeTracker.SetShadowISoftDeletableProperties();
ChangeTracker.SetShadowIUserOwnableProperties(UserResolver);
ChangeTracker.SetShadowIAuditableProperties(UserResolver);
return await base.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
}
}

SaveChangesAsync 方法可以看出,我已经将影子属性用于其他跟踪项,例如审计或用户所有权,这些都没有问题。

最后,这里是负责设置软删除的Change Tracker代码

    public static void SetShadowISoftDeletableProperties(this ChangeTracker changeTracker)
{
changeTracker.DetectChanges();
foreach (var entry in changeTracker.Entries())
{
if (typeof(ISoftDeletable).IsAssignableFrom(entry.Entity.GetType()))
{
if (entry.State == EntityState.Deleted)
{
entry.State = EntityState.Modified;
entry.Property("IsDeleted").CurrentValue = true;
}
else if (entry.State == EntityState.Added)
{
entry.Property("IsDeleted").CurrentValue = false;
}
else
{
entry.Property("IsDeleted").CurrentValue = entry.Property("IsDeleted").OriginalValue;
}
}
}
}

一切正常,IsDeleted 属性已在数据库中成功设置;然而,当我检查我的 result.State 时,它告诉我实体状态是 Unchanged(这导致我的 DeleteAsync 返回 false),我不太明白。即使在代码中也是可见的,我将状态从 Deleted 更改为 Modified

我当然可以忽略这一点,而是在保存更改后返回纯真(如果出错,之前会失败);但我只是想了解为什么我会得到这种意想不到的状态结果。非常感谢有关此事的任何帮助。

最佳答案

AddedModifiedDeletedpending 状态,指示 EF Core 将对该实体执行的操作SaveChanges{Async} 被调用。 ChangeTracker.HasChanges() 当存在任何具有这种状态的实体条目时返回 true。

默认情况下(SaveChanges{Async}acceptAllChangesOnSuccess=true 参数),SaveChanges 成功后,这些状态会更新以反射(reflect)这些实体的永久(数据库)状态。 AddedModified 变为 UnchangedDeleted 变为 Detached(条目从更改跟踪器)和 ChangeTracker.HasChanges() 返回 false。

您可以通过将 acceptAllChangesOnSuccess=false 传递给 SaveChanges{Async} 来更改它,在这种情况下您会看到挂起状​​态,但是您不应该忘记调用 ChangeTracker.AcceptAllChanges(),否则下一个 SaveChanges{Async} 将尝试在数据库中重新应用它们(很可能会失败)。

关于c# - EF Core > 删除实体(软删除)> 实体状态保持不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65580520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com