我有一个具有 EntitySet 的 Linq to Sql 实体。在我的视图中,我显示实体及其属性以及子实体的可编辑列表。用户可以动态添加和删除这些子实体。到目前为止,DefaultModelBinder 工作正常,它正确绑定了子实体。
现在我的问题是我无法让 Linq To Sql 删除已删除的子实体,它会很乐意添加新实体但不会删除已删除的实体。我在外键关系中启用了级联删除,Linq To Sql 设计器在外键关系中添加了“DeleteOnNull=true”属性。如果我手动删除这样的子实体:
myObject.Childs.Remove(child);
context.SubmitChanges();
这将从数据库中删除子记录。但我无法让它适用于模型绑定对象。我尝试了以下方法:
// this does nothing
public ActionResult Update(int id, MyObject obj) // obj now has 4 child entities
{
var obj2 = _repository.GetObj(id); // obj2 has 6 child entities
if(TryUpdateModel(obj2)) //it sucessfully updates obj2 and its childs
{
_repository.SubmitChanges(); // nothing happens, records stay in DB
}
else
.....
return RedirectToAction("List");
}
这会引发 InvalidOperationException,我有一个德国操作系统,所以我不确定错误消息是什么英文,但它说的是实体需要版本(时间戳行?)或没有更新检查策略. 我已将 UpdateCheck="Never" 设置为除主键列之外的每一列。
public ActionResult Update(MyObject obj)
{
_repository.MyObjectTable.Attach(obj, true);
_repository.SubmitChanges(); // never gets here, exception at attach
}
我已经阅读了很多关于 Linq To Sql 的类似“问题”,但似乎大多数这些“问题”实际上是设计使然。那么我的假设是否正确,这不像我期望的那样起作用?我真的必须手动遍历子实体并手动删除、更新和插入它们吗?对于这样一个简单的对象,这可能有效,但我计划使用嵌套的 EntitySet 等创建更复杂的对象。这只是一个测试,看看什么有效,什么无效。到目前为止,我对 Linq To Sql 感到失望(也许我只是不明白)。对于这种情况,Entity Framework 或 NHibernate 会是更好的选择吗?或者我会遇到同样的问题吗?