违反了多重约束.关系'...'的作用'...'具有多重性1或0..1

use*_*694 15 asp.net entity-framework

我从我的DbContext收到以下错误:"违反了多重约束.关系'MyModel.FK_ChildEntities_MyEntities'的角色'MyEntity'具有多重性1或0..1."

使用ASP.NET,Entity Framework 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();
}
}
Run Code Online (Sandbox Code Playgroud)

例如,这会产生多重性错误:

// 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;

    }
Run Code Online (Sandbox Code Playgroud)

use*_*694 16

不知何故,dbcontext会记住添加了哪些对象.如果完全相同的对象出现两次,它......吹

而不是将我的分离实体中的子实体添加到附加的实体,我应该创建每个孩子的新副本

ChildEntity detachedChild = detachedEntity.ChildEntities.First();
attachedEntity.ChildEntities.Add(new ChildEntity { 
   propertyA = detachedChild.propertyA,
   propertyB = detachedChild.propertyB
});
Run Code Online (Sandbox Code Playgroud)

代替

attachedEntity.ChildEntities.Add(detachedEntity.ChildEntities.First());
Run Code Online (Sandbox Code Playgroud)


Art*_*dez 9

问题是应该为detaachedChild.parent分配attachmentParent.

foreach(var detachedEntity in detachedEntities)
{
     attachedEntity.ChildEntities.Add(detachedEntity); 
     detachedEntity.ParentEntity = attachedEntity;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个.你会认为将一个孩子附加到一个新的父母身上会让真正的父母明显是谁,但是没有.谢谢,这是解决方案. (4认同)