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)
问题是应该为detaachedChild.parent分配attachmentParent.
foreach(var detachedEntity in detachedEntities)
{
attachedEntity.ChildEntities.Add(detachedEntity);
detachedEntity.ParentEntity = attachedEntity;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27749 次 |
| 最近记录: |