我有一些代码使用EF5软删除应用程序中的记录。我的“删除”类实现了ISoftDelete,它只是说实现者必须有一个bool Deleted属性。
当我的用户点击删除时,我调用DbContext..Remove(entity)
这会将绑定到父实体的所有属性清除为null(如果我的父项具有可删除实体的集合!)。
在我的DbContext中,我覆盖SaveChanges方法以查找任何已删除的实体,如果它们实现我的ISoftDelete接口,我将状态设置为已修改而不是已删除,并将其Deleted属性设置为true以标记为已删除。我的问题是持有对父项的引用的属性为null。
调查似乎指向ApplyOriginalValues但由于我的值不是公共属性,而是因为我是集合中的孩子而为我创建的,所以我很难实现。你能帮忙吗?
答案 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();
}
}