我正在尝试将断开连接的实体附加到实体框架上下文并将其添加到该上下文中。例如:
我有一个客户实体和一个导航属性来详细说明订单的实体。其想法是获得Customer实体并对该实体进行修改,然后向Customer主体添加新的Order。
当我尝试附加(我认为这是正确的使用方法。)客户实体时,问题就开始了。因为现在已经附加了整个对象图,所以我得到了以下错误:
"具有临时EntityKey值的对象不能附加到对象上下文。"
我知道这个错误是因为添加了订单实体,这些实体应该是添加而不是附加。
是否有方法将具有新子实体的现有实体附加或添加到上下文?
如果要以这种方式使用Attach
,则不应使用基于EntityObject
的实体,而应使用POCO。无论如何,您仍然需要遍历整个对象图,并为每个实体和独立关联设置正确的状态(修改、添加、删除)。最后,即使使用POCO,附加分离的对象图也非常困难——最好的方法不是附加图,而是从数据库加载相同的数据,并将分离的图与加载的图同步(您必须自己编写代码)。
经过一些研究,我找到了解决这个问题的方法:
我现在没有将Customer对象附加回上下文,而是将Customerodified。
我必须将Customer对象复制到一个新的Customerobject中以去除EntityKey(不能添加带有EntityKey的对象,必须Attach它),然后使用AddObject方法将新的Customer对象添加到上下文中。
它有点丑,但它有效。我愿意接受其他建议吗?
您描述的问题也是我关于CodeProject的文章的主题:用实体框架重附加实体图.
请注意,最新代码可在ef4tiers.codeplex.com.