错误使用ADO.NET实体框架

问题描述:

我想一个列表转换为EntityCollection。错误使用ADO.NET实体框架

List<T> x = methodcall(); 
EntityCOllection<T> y = new EntityCollection<T>(); 

foreach(T t in x) 
    y.Add(t); 

我得到这个错误。

该对象无法添加到 EntityCollection或EntityReference中。 一个附加到一个 ObjectContext的对象不能被添加到 EntityCollection或的EntityReference 不与源 对象相关联。

任何人都知道这个错误?

+0

我解决了它。 我的DId是 y.attach(x); 我不知道为什么添加没有工作,但为我附加工作。 – alice7 2010-03-04 20:51:44

这听起来像x是ObjectContext的查询结果。每个ObjectContext跟踪它从数据库中读取的实体以启用更新方案。它跟踪实体以知道何时(或如果)它们被修改,哪些属性被修改。

术语是,实体附加到ObjectContext。在你的情况下,x中的实体仍然附加到实现它们的ObjectContext,所以你不能同时将它们添加到另一个EntityCollection。

您可以这样做,如果你第一次Detach他们,但如果你这样做,第一ObjectContext的停止追踪他们。如果您不想再次更新这些项目,这不是问题,但如果您以后需要更新它们,则必须再次使用Attach这些项目。

+0

对不起您的建议是什么?我完全不明白 – alice7 2010-03-04 19:47:14

+0

您可以在此处查看有关附加和分离对象图的更多信息:http://msdn.microsoft.com/en-us/library/bb896271.aspx – 2010-03-04 19:49:32

基本上所有实体对象由用作变更跟踪对象上下文控制。这里的想法是,实体本身对他们的环境愚蠢,但对象上下文知道发生了什么。

这是DataSet模型的反转,其中表格跟踪自己的更改。

所以对象添加到直接对象上下文和它的实体集合。在这里,您创建了一个与对象上下文无关的EntityCollection,因此不能添加其他对象。它们必须首先附加到对象上下文中。

真的,你可能想要的是返回IQueryable而不是IList。这将允许您对methodcall()的结果执行查询。