跨多个帖子在ASP.NET中使用自我跟踪实体

时间:2010-12-14 10:11:42

标签: asp.net entity-framework entity-framework-4 self-tracking-entities

我有一个简单的要求(所以我想......!)

我有一个由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等)?

干杯 - 帮忙! :)

尼克

2 个答案:

答案 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