【问题标题】:EF 4 deleting related items before the entity is savedEF 4 在保存实体之前删除相关项目
【发布时间】:2013-04-03 19:27:07
【问题描述】:

假设我有以下两个实体:

Item
 int Id
 ICollection<ChildItem> ChildItems

ChildItem
 int Id
 Item ParentItem

(在 EF 设计器和 SQL 服务器上,从 Item 到 ChildItem 设置删除级联) 我有一些这样的代码:

Item newItem = new Item();
ChildItem child1 = new ChildItem();
ChildItem child2 = new ChildItem();
newItem.ChildItems.Add(child1);
newItem.ChildItems.Add(child2);
myContext.Items.AddObject(newItem);
// Then much, much further down the line
myContext.Items.DeleteObject(newItem);

现在,EF 是否会自动判断它还必须删除子项,还是我应该自己删除它们?

问题是,如果我在 DeleteObject 之前添加 SaveChanges(),我的删除代码可以正常工作,但如果我尝试先删除,然后保存更改,我往往会得到一些“无法确定关联的主体端” “——例外。现在我正在尝试使用 EF 4 进行类似的操作。使用 EF5,我只会使用 context.Local -property,但现在我不太确定 EF 4 对添加了实体状态的对象做了什么。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    也许将newItem 的状态更改为Unchanged 可以解决问题。

    但我会采取不同的方法。显然,您正处于决定哪些新项目最终将提交到数据库的过程中。我将使用这些项目的简单本地List&lt;T&gt;,最初只在此列表中添加/删除项目。最后,当一切都整理好后,您将剩余的项目添加到myContext.Items 并保存更改。它还将减少开销,因为更改跟踪器将不那么忙。

    【讨论】:

    • 是的,很好看,我完全忘了解释这部分过程。事情是,我的实际案例包含旧的(从数据库中读取)和新的(最近创建的,尚未保存的)实体。但即便如此,将所有新创建的项目保存在一个单独的列表中,我可以从中删除它们,然后在保存之前浏览列表似乎确实是一个不错的选择。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多