"软删除"在实体框架5中

时间:2013-08-29 20:34:22

标签: entity-framework entity-framework-5

我有一些代码使用EF5软删除应用程序中的记录。我的“删除”类实现了ISoftDelete,它只是说实现者必须有一个bool Deleted属性。

当我的用户点击删除时,我调用DbContext..Remove(entity)

这会将绑定到父实体的所有属性清除为null(如果我的父项具有可删除实体的集合!)。

在我的DbContext中,我覆盖SaveChanges方法以查找任何已删除的实体,如果它们实现我的ISoftDelete接口,我将状态设置为已修改而不是已删除,并将其Deleted属性设置为true以标记为已删除。我的问题是持有对父项的引用的属性为null。

调查似乎指向ApplyOriginalValues但由于我的值不是公共属性,而是因为我是集合中的孩子而为我创建的,所以我很难实现。你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

我认为如果您使用其他方法,可能会更容易。 使用存储库和工作单元fascade模式而不是直接调用EF Context,意味着您可以更轻松地控制操作。 工作单元控制savechanges操作。  存储库类控制CRUD,GetLists等。

   public class RepositoryBase<TPoco> : IRespository {

       public RepositoryBase(DbContext context) { Context = context; }
          //... CRUD methods....
          public bool Remove(TPoco poco) {
                   if (typeof ISoftDelete).IsAssignableFrom(Typeof(TPoco)){
                       // proceed with modify actions
                   }
                   else {
                          Context.Set<TPoco>().Remove(poco);
                   }
          }
   }

   public class Luw : ILuw{
         // ....
          public IRepositoryBase<TPoco> GetRepository<TPoco>() where TPoco : ???{
              return (new RepositoryFactory<TPoco>().GetRepository(Context));
         }

  public MuCustomResult  Commit() {
          .... any special context manipulation before save
          myCustomResultRecordsAffected = Context.SaveChanges();

  }
}