2013-08-29 40 views
3

我在使用EF5应用一些代码来软删除记录。我的“deletable”类实现了ISoftDelete,它只是说实现者必须具有一个bool Deleted属性。“软删除”在实体框架5

当我的用户点击删除我打电话DbContext..Remove(实体)

这将清除绑定到父实体为null的任何属性(如果我父母有我删除的实体的集合!)。

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

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

回答

2

我觉得如果你使用另一种方法可能会更容易。 使用存储库和Unit of Work 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(); 

    } 
} 
+0

我认为你可能是对的Phil。不知道要付出多少努力,但绝对是正确的做法。欢呼的建议,会去互联网寻找一个很好的简单的EF知识库例子/教程。 – CheGuevarasBeret

+0

如果您有权访问pluralsight我知道有一些很好的例子。但加入需要花费。 –