gpt4 book ai didi

c# - Entity Framework 覆盖保存对软删除实体的更改

转载 作者:行者123 更新时间:2023-11-30 23:15:16 26 4
gpt4 key购买 nike

我正在尝试覆盖我的数据库上下文中的 Savechanges 以将我的实体标记为 SoftDeleted。

我有一个 ISoftDeletable 基础,我在我的实体类中覆盖了它

public interface IsoftDeletable
{
public bool IsDeleted {get; set;}
}

然后在我的上下文中

public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries()
.Where(p => p.State == EntityState.Deleted))
SoftDelete(entry);

return base.SaveChanges();
}

private void SoftDelete(DbEntityEntry entry)
{
var entity = entry.Entity as ISoftDeltable;
entity.IsDeleted = true;
entry.State = EntityState.Modified;
}

如果我删除一个实体,上面的示例会正常工作,它会被软删除,但问题是,如果该实体具有带级联删除的子集合,则 Entity Framework 不会跟踪子集合,并且它们不会被标记为已删除。

一个简单的解决方案是在删除发生之前急切地加载将要删除的实体的所有子集合,这样 Ef 也会跟踪子集合的变化并软删除它们,但这是一个“hack”我想避免。很难记住实体之间的所有关系并在删除发生之前急切加载所有内容。如果模型发生变化,也很难维护它。

有没有更好的方法来实现这种功能?

编辑 1:我不明白这个问题怎么可能与 this 重复

最佳答案

我会在 DBMS 端尝试一些东西,而不是在应用程序端。

我假设您有 MS SQL Server。 MS SQL Server 以类似于“级联删除”的方式支持“级联更新”。这意味着如果您有一个带有主键 PersonID 的 Person 表和一个 Car 表,其中有一个 PersonID 外键引用 Person 表中的 PersonID,每当您更改 Person 中 PersonID 的值时,相关记录中的外键汽车也更新了这个值。

所以在你的情况下我会做的是修改外键。假设您有两个表:

人:(PersonId, Name, Age, IsDeleted)
汽车:(CarId, Make, Model, PersonId, IsDeleted)

PersonID是Person中的PK,CarId是Car中的PK。而不是使 Car.PersonId 成为引用 Person.PersonId 的 FK,而是创建一个复合外键:(Car.PersonId, Car.IsDeleted) => (Person.PersonId, Person.IsDeleted) 并且指定“on update cascade”此复合 FK 的选项。这样,每当您更改 Person.PersonId(您永远不会更改)或 Person.IsDeleted 时,新值将级联更新到相应的 Car.PersonId(同样,不会级联更新,因为 Person.PersonId 不会更改)和Car.IsDeleted.

关于c# - Entity Framework 覆盖保存对软删除实体的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42678359/

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