当前位置:编程学习 > C#/ASP.NET >>

EF 的DbContext 使用外键更新关系时出现错误,如何解决

我在使用EF的DbContext,模仿Programming Entity Framework DbContext第4章,更新关系数据库关系时,出现错误,具体描述如下:

模型定义Parent与Child是1对多关系,使用ParentID外键。
[Table("Parent")]
public class Parent 
{
public int ParentId { get; set; }
[MaxLength(200)]
public string Name { get; set; }

public ICollection<Child> Children { get; set; }
}

public class Child
{
public int ChildID { get; set; }
[MaxLength(200)]
public string Name { get; set; }

public int ParentID { get; set; }
public Parent Parent { get; set; }
}

数据库中Parent表初始包含两个数据FirstParent和SecondParent,child表中初始含有三个数据:child1和child2属于FirstParent,child3属于SecondParent。

修改关系:将 child1.ParentID = SecondParent.ParentID, 如果在修改时不出现FirstParent,则程序正确运行,但是如果在修改前出现FirstParent,则程序报错“

“System.InvalidOperationException”类型的未经处理的异常出现在 System.Data.Entity.dll 中。
其他信息: 违反了引用完整性约束: 在此关系的主对象和依赖对象之间,定义引用约束的属性值不一致。
”。

请问如何在持有FirstParent的情况下修改child1?

测试程序如下:
private static void TestUpdateChild ( )
{
Parent oldParent;
Parent newParent;
Child child;
using(var context = new FamilyContext( ))
{
// 不可使用oldParent,否则报错。
//  oldParent = (from d in context.Parents
//  where d.Name == "FirstParent"
//  select d).Single( );

newParent = (from d in context.Parents
where d.Name == "SecondParent"
select d).Single( );

child = (from d in context.Children
where d.Name == "Child1"
select d).Single( );
}
child.ParentID = newParent.ParentId;
UpdateChild(child);
// 原目的是为了显示整个修改关系
//      Console.WriteLine("Old parent {0}'s child {1} belong to new parent {2}",
//        oldParent.Name, child.Name, newParent.Name);

// 此时不能出现OldParent
Console.WriteLine("child {0} belong to new parent {1} now!",
child.Name, newParent.Name);
}

private static void UpdateChild (Child child)
{
using(var context = new FamilyContext( ))
{
context.Entry(child).State = EntityState.Modified;
context.SaveChanges( );
}
}
补充:.NET技术 ,  .NET Framework
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,