ADO.NET实体框架使用出错

4

我想把一个列表转换成实体集合(EntityCollection)。

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

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

我遇到了这个错误。

无法将对象添加到 EntityCollection 或 EntityReference。已连接到 ObjectContext 的对象不能添加到未与源对象关联的 EntityCollection 或 EntityReference 中。

有人知道这个错误吗?


我解决了。 我的做法是: y.attach(x);我不知道为什么add没起作用,但attach对我有用。 - alice7
2个回答

2

看起来x是一个ObjectContext查询的结果。每个ObjectContext都会跟踪它从数据库中读取的实体,以便启用更新场景。它会跟踪这些实体,以了解它们何时(或是否)被修改,以及哪些属性被修改。

术语是这些实体被附加到ObjectContext上。在您的情况下,x中的实体仍然附加到生成它们的ObjectContext上,因此您无法同时将它们添加到另一个EntityCollection中。

如果您首先分离它们,可能可以这样做,但如果您这样做,第一个ObjectContext将停止跟踪它们。如果您永远不想再次更新这些项目,则没有问题,但是如果稍后需要更新它们,则必须再次附加它们。


抱歉,您的建议是什么?我没有完全理解。 - alice7
您可以在此处的文档中了解有关附加和分离对象图的更多信息:http://msdn.microsoft.com/zh-cn/library/bb896271.aspx - Mark Seemann

0

基本上所有实体对象都由一个对象上下文控制,该上下文作为更改跟踪器。这里的想法是实体本身对其环境是无知的,但对象上下文知道发生了什么。

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

因此,对象被添加到对象上下文及其实体集合中。在这里,您已创建了一个与对象上下文不相关联的EntityCollection,因此无法向其添加其他对象。必须首先将它们附加到对象上下文。

真正想要的可能是返回IQueryable而不是IList。那样可以针对methodcall()结果执行查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接