我的 DbContext 出现以下错误:“违反了多重性约束。关系‘MyModel.FK_ChildEntities_MyEntities’的角色‘MyEntity’的多重性为 1 或 0..1。”
使用 ASP.NET,实体框架 4
使用分离的实体
我第二次尝试将实体重新附加到 dbcontext 时发生该错误。场景是一次不成功的保存,然后重新尝试。
我在会话中有一个分离的实体。用户更改表单中的属性,添加内容,删除内容,最后单击保存。我从 dbcontext 的新实例中获取实体的附加副本,将分离实体的更改应用到附加实体,验证,找到错误并中止。用户更改任何内容并再次保存。
在第二次保存时,整个保存过程会重复,只是这一次一切都下地狱了。几乎所有内容都是重复的,导致一个错误或另一个错误或所有错误。仅应作为引用的视图和查找表中的值被创建为新的并重新分配了 id。我已经能够解决大多数这些问题,但我留下了多重性错误。子元素被创建为其他子元素的精确副本,直到唯一的 id,仅处于已添加状态。或者,如果我引用某些属性,而不是克隆一个未修改的孩子,它会删除新的。无论哪种方式,都没有像第一次那样执行代码。
每次保存尝试时,我都会丢弃 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;
}