我有一个简单的要求(所以我想......!)
我有一个由Order,OrderLine,Product。组成的模型。
我想创建一个Order并添加OrderLines(每个OrderLine与一个Product相关)。我创建订单并向其添加新的OrderLines。在帖子之间我将Order实体存储在Session(或ViewState)中。只是你知道我已经为二进制序列化添加了suppport,它工作正常。
因此,关系是订单> OrderLine(s)>产物(S)。
你可能已经猜到了问题是什么 - 当我SaveChanges()时,我得到通常的'AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。错误。
我在网上提到了很多文章但似乎没有处理这种情况(我在两个以上的实体之间有关系),例如http://blogs.msdn.com/b/diego/archive/2010/10/06/self-tracking-entities-applychanges-and-duplicate-entities.aspx
这肯定是一个非常普遍的要求吗?是否有人在实体框架中做同样的事情(并且没有使用DTO等)?
干杯 - 帮忙! :)
尼克
答案 0 :(得分:0)
这是我决定做的......
使用EF生成的实体和关联(NOT STEs - 您是正确的Nick)来构建订单。始终包含外键。
将MergeOption设置为NO TRACKING即分离。
在用户构建订单时,在帖子/页面请求之间保存SESSION中的相关实体。
重要提示:关联子实体(例如OrderLines)时,不要通过关系关联现有子实体,而是使用FK Id。所以不要使用OrderLine.Product = product,而是使用OrderLine.Product_Id = product.Id。这解决了来自不同上下文的多个实体存在的问题。
当订单完成并准备保存时,添加到上下文和SaveChanges。
-
编辑现有订单时...
将MergeOption设置为NO TRACKING。
在用户编辑订单时,在帖子/页面请求之间保存SESSION中的相关实体。
我使用自己的实体状态指示器,以便记录分离时是否添加,修改或删除实体。
当编辑完成并准备保存时,附加到上下文,处理更改(将ObjectState设置为MODIFIED等)和SaveChanges。
-
实现梦想 - 短暂的上下文(UOW) - 没有视图模型或DTO(只使用实体类) - 没有复杂的代码(分离/附加图形等)。
注意:不存储在VIEWSTATE中。需要研究这个,因为我想要从InProc更改为SQL。将更新。
也许我错过了一些东西,但我花了很多时间研究可能的解决方案。
答案 1 :(得分:0)
我听到很多“不是什么”,但为什么不呢?我有一个多层应用程序,有WinForms,WPF和ASP.Net组件,我正在使用我的STEs所有图层。在ASP中,请确保在发布/更改之间将STE保持适当地恢复到Viewstate \ Sessionstate,并且您的代码应该可以正常工作。
我的实体有很多级别的关系没有问题,这里几乎没有例子,因为无论有多少级别,主体都是相同的。 如果您有时间/耐心让脚本满足您的需求,我建议坚持使用STE。我现在有一个基于STEs的可靠框架,我在我的所有应用程序中都使用它。
当模型和管理应用程序实际上是.Net 4.0时,STE允许我访问SharePoint(.Net 3.5)中的数据,这是STEs与实体框架经常被忽视的好处之一。
有关您的特定问题的帮助,请参阅Self-Tracking Entities: ApplyChanges and duplicate entities 。