在我的通用基础存储库中,我具有以下用于从数据库中删除实体的简单方法:
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
。
我可以肯定地忽略它,而是在保存更改后返回纯真(如果发生错误,它将在此之前失败);但是我只是想了解为什么我得到这种意外状态结果。在这方面的任何帮助将不胜感激。
Added
,Modified
以及Deleted
处于待处理状态,表明EF Core在SaveChanges{Async}
被调用时将对该实体执行的操作。ChangeTracker.HasChanges()
当存在任何具有这种状态的实体条目时,返回true。
默认情况下(的acceptAllChangesOnSuccess=true
参数SaveChanges{Async}
),成功后,SaveChanges
将更新这些状态以反映这些实体的永久(数据库)状态。Added
并且Modified
成为Unchanged
,Deleted
成为Detached
(并且条目已从变更跟踪器中删除)并ChangeTracker.HasChanges()
返回false。
您可以通过传递acceptAllChangesOnSuccess=false
给来进行更改SaveChanges{Async}
,在这种情况下,您将看到挂起的状态,但是您不要忘记调用ChangeTracker.AcceptAllChanges()
,否则下一个SaveChanges{Async}
将尝试在数据库中重新应用它们(并且很可能会失败)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句