我们正在启动一个新的应用程序。我们想使用实体框架。我们几乎不怕意外删除sql行(尤其是意外设置相关数据等)
我想禁用每次删除,因为我们只是用"validUntil"列标记每一行,并且从不删除行。
我看到它可以在 sql 中通过角色来完成,但我希望所有的逻辑和控制都只在代码中。
也许在实体框架核心中有新功能可以启用它?我知道它仍然可以使用 EF 编写行 sql,但我们不怕这种情况。
我还尝试删除实体关系的 setter 以使其更加轻松,但它破坏了 EF 的正常功能,并且看起来不是一个好主意。
我在上面的链接中看到使用存储库模式的建议,但这里看起来这不是好的做法。
如何安全地使用 EF?谢谢!
角色选项是一种方式,但您也可以覆盖 SaveChanges。
public override int SaveChanges()
{
foreach (DbEntityEntry entity in this.ChangeTracker.Entries)
{
if (entity.State == System.Data.EntityState.Deleted)
return;
}
base.SaveChanges();
}
编辑
我在 git 上读到了 EF Core 的内容:
如果要更改所有关系的删除行为,则 您可以在 OnModelCreateating(...) 中使用此代码为所有人批量设置它 模型中的关系。
foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
威廉的回答几乎是这样做的方法,但你也可以做这样的事情。
将"删除"设置为引发异常,并添加"删除虚拟"方法。主要是这也是更新,您可以通过更新validTil字段来执行所需的软删除。
T IDbContext.Delete<T>(T entity)
{
throw new NotImplementedException();
}
T IDbContext.DeleteVirtual<T>(T entity)
{
this.Entry(entity).State = EntityState.Modified;
return entity;
}
类中覆盖SaveChanges()
方法DbContext
在那里您可以获取已删除实体的列表并将其Status
更改为Unchanged
。
public override int SaveChanges()
{
var DeletedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Deleted).ToList();
DeletedEntities.ForEach(E =>
{
E.State = EntityState.Unchanged;
});
return base.SaveChanges();
}