无法使用具有主 - 详细信息关系的EF插入数据

时间:2010-10-27 17:15:21

标签: entity-framework-4

假设我有2个表:

Person(pid, ....)   //Pid is identify colum as primary key
Student(pid, Student_No,...)   //pid is foreign key from Person, pid is a primary key too.

然后使用EF生成实体模型。然后尝试使用以下代码插入新数据:

 Person person = new Person()
           { FirstName = "FirstName", LastName= "LastName", ... };
 Student student = new Student(){Student_No="001", ...};
 Student.Person = person;
 mycontext.Students.AddObject(student);
 mycontext.SaveChanges();

然后我得到错误: ReferentialConstraint中的依赖属性映射到存储生成的列。专栏:'pid'。

如何解决?

修改代码如:

 Person person = new Person(){ FirstName = "FirstName", LastName= "LastName", ... };
  mycontext.People.AddObject(person);
  mycontext.SaveChanges();

 Student student = new Student(){Student_No="001", Person = person,  ...};
 // or  Student student = new Student(){Student_No="001", pid= person.pid,  ...};
 mycontext.Students.AddObject(student);
 mycontext.SaveChanges();

然后我能够为人插入,但对于学生,仍然得到相同的错误。在EDM中检查Student实体pid属性:storegeneratedPatteren = None。相当困惑。

2 个答案:

答案 0 :(得分:0)

听起来你有一个学生,这是一种人。如果是这样,那么您应该考虑使用Table-per-type Inheritance。详情请http://msdn.microsoft.com/en-us/library/bb738685.aspx


<强>编辑:

如果您选择不使用继承,则需要先插入此人:

 Person person = new Person()
           { FirstName = "FirstName", LastName= "LastName", ... };

 mycontext.Person.AddObject(person);
 mycontext.SaveChanges();

答案 1 :(得分:0)

  

在EDM中检查学生实体pid属性:storegeneratedPatteren = None。相当困惑。

仍然与要添加的表的身份规范(身份,身份增量,身份种子)或关系映射到的表列有关。错误'ReferentialConstraint中的依赖属性映射到存储生成的列'显示是否:

  1. 将新对象传递给addObject(),其中包含一个字段,该字段的值已设置为应由数据库生成。解决方案:不要为数据库中具有自动增量ID的字段传递值。

  2. 您不小心将表的主键映射到数据库中的错误外部列。解决方案:查看外键关系。

  3. 第二种情况不太明显,但如果您在图表中快速拖放约束,则会经常发生。