C# 使用实体框架在ModelBuilder中获取注册实体

C# 使用实体框架在ModelBuilder中获取注册实体,c#,entity-framework,soft-delete,C#,Entity Framework,Soft Delete,我到处都找不到这个。基本上,我想知道是否有可能在DbModelBuilder中获取所有注册的实体 如果您需要上下文,基本上我在应用程序中实现软删除 public override int SaveChanges() { var changeSet = ChangeTracker.Entries(); var deleted = changeSet.Where(x => x.State == EntityState.Deleted); foreach (var del

我到处都找不到这个。基本上,我想知道是否有可能在DbModelBuilder中获取所有注册的实体

如果您需要上下文,基本上我在应用程序中实现软删除

public override int SaveChanges()
{
    var changeSet = ChangeTracker.Entries();
    var deleted = changeSet.Where(x => x.State == EntityState.Deleted);
    foreach (var deletedItem in deleted.Where(x => x.Entity is SoftDeleteable))
    {
        SoftDelete(deletedItem);
    }
}
在不涉及太多细节的情况下,上面的算法正在处理我想要做的事情,并且正在工作。如果我有一个实现“SoftDeleteable”接口(这只是一个“Deleted”属性)的模型类,EF不会删除它,而是设置“Deleted”列

当我不得不这样做时,真正的问题就出现了

modelBuilder.Entity<Policy>()
    .Map(p => p.Requires("Deleted").HasValue(false))
    .Ignore(p => p.Deleted);
但我找不到任何类似“注册身份”属性的东西。有什么想法吗


谢谢

为什么要
忽略该属性?这难道不会使您的软删除不起作用吗?我没有添加这一点,因为这与问题无关,但这一切都是通过执行sql来处理的。我不希望SoftDeletable对象的用户必须担心Deleted标志。他们只是像普通一样使用对象,并像普通一样删除它(从dbContext中删除它)。为什么不简单地进行更新而不是实际删除?我们做了一些非常类似的事情,我们有一个存储库,delete方法实际上并不调用delete,而是更新记录的status列。看起来你把一些可能/应该非常简单的事情复杂化了,因为这不是一个绿色领域的项目,而且有很多地方在存储库之外进行删除。在我们的用例中,将其作为SaveChanges处理要好得多。另外,当查询对象时,您会做什么?您是否总是在所有导航属性中包含“Where Deleted=false”?使用我正在实现的解决方案,您不必担心这一点,为什么要
忽略该属性?这难道不会使您的软删除不起作用吗?我没有添加这一点,因为这与问题无关,但这一切都是通过执行sql来处理的。我不希望SoftDeletable对象的用户必须担心Deleted标志。他们只是像普通一样使用对象,并像普通一样删除它(从dbContext中删除它)。为什么不简单地进行更新而不是实际删除?我们做了一些非常类似的事情,我们有一个存储库,delete方法实际上并不调用delete,而是更新记录的status列。看起来你把一些可能/应该非常简单的事情复杂化了,因为这不是一个绿色领域的项目,而且有很多地方在存储库之外进行删除。在我们的用例中,将其作为SaveChanges处理要好得多。另外,当查询对象时,您会做什么?您是否总是在所有导航属性中包含“Where Deleted=false”?有了我正在实施的解决方案,您不必担心这一点
foreach(var entity in modelBuilder.RegisteredEntities.Where(x => x.GetType().IsAssignableFrom(typeof(SoftDeleteable))) {
    entity.Map(p => p.Requires("Deleted").HasValue(false))
        .Ignore(p => p.Deleted);
}