使用ASP.NET,Entity Framework 4。
处理一个分离的实体。
当我尝试将实体重新附加到DbContext时出现错误。场景是一个不成功的保存操作后进行的再次尝试。
我有一个在会话中的分离实体。用户在表单中更改属性、添加和删除内容,最终点击保存。我从一个新的DbContext实例中获取一个已附加的实体副本,将来自分离实体的更改应用于已附加的实体,进行验证并查找错误并中止。用户进行任何更改并再次保存。
在第二次保存时,整个保存过程重复,但这一次所有事情都变得非常混乱。几乎所有内容都被复制,导致一个或多个错误。视图和查找表中的值只应该是引用,并且会创建新的并重新分配id。其中大部分问题我已经能够解决,但我还面临着多重性错误。子元素被创建为其他子元素的完全副本,直到唯一id,仅处于Added状态。或者,如果引用某些属性,则不是克隆未修改的子元素,而是删除新的子元素。无论哪种方式,没有任何代码像第一次运行那样执行。
我在每次保存尝试时丢弃DbContext和附加的实体实例。我认为这应该足以恢复任何更改,但某些东西必须留下来。唯一未被丢弃或重置的是分离实体,它在会话中,但我没有直接对其进行任何更改。
void Save()
{
using (var context = new MyContext())
{
// detached entity from session
MyEntity detachedEntity = (MyEntity)Session["DetachedEntity"];
// attached entity from context
MyEntity attachedEntity = context.MyEntities.Single(x=>x.id == detachedEntity.id);
// <remove children representing lookup table elements from detachedEntity to prevent duplicates>
// <remove children representing view elements from detachedEntity to prevent duplicates>
// <apply changes from detachedEntity to attachedEntity>
// <add new children>
// <remove deleted children>
// <update modified children>
// <set entity state to unchanged on view and lookup elements of attachedEntity to ensure no duplicates...>
// <validate>
if (errors.count>0)
// <report errors>
else
context.SaveChanges();
}
}
举个例子,这会产生一个多重性错误:
// represents first save:
using (var context = new MyContext())
{
// detached entity from session
MyEntity detachedEntity = (MyEntity)Session["DetachedEntity"];
// attached entity from context
MyEntity attachedEntity = context.MyEntities.Single(x=>x.id == detachedEntity.id);
int debug1 = context.ChangeTracker.Entries<ChildEntity>().Count(); // debug1 == 0;
attachedEntity.ChildEntities.Add(detachedEntity.ChildEntities.First());
int debug2 = context.ChangeTracker.Entries<ChildEntity>().Count(); // debug2 == 1;
}
// represents second save:
using (var context = new MyContext())
{
// detached entity from session
MyEntity detachedEntity = (MyEntity)Session["DetachedEntity"];
// attached entity from context
MyEntity attachedEntity = context.MyEntities.Single(x=>x.id == detachedEntity.id);
int debug1 = context.ChangeTracker.Entries<ChildEntity>().Count(); // debug1 == 0;
attachedEntity.ChildEntities.Add(detachedEntity.ChildEntities.First());
int debug2 = context.ChangeTracker.Entries<ChildEntity>().Count(); // multiplicity error;
}
ChildEntity
е№¶е°†е…¶ж·»еЉ е€°ChildEntities Table
,然后建立关联。 - MohsenattachedEntity
(MyEntity
)有一个ChildEntity
的集合时,我遇到了这个问题,但是我的ChildEntity
模型没有MyEntity
的集合。但是我只想保留一个ChildEntity
实例,所以当我将MyEntity
的集合添加到ChildEntity
时,我可以使用attachedEntity.ChildEntities.Add(detachedEntity.ChildEntities.First());
- Reuben