Entity framework 4 无法将数据插入到具有主-明细关系的EF

Entity framework 4 无法将数据插入到具有主-明细关系的EF,entity-framework-4,Entity Framework 4,假设我有两张桌子: 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 = "Fir

假设我有两张桌子:

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:storegeneratedPatteren=None中的学生实体pid属性。很困惑

听起来你有一个学生,他是那种人。如果这是真的,那么你应该考虑使用。这里的细节

编辑:

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

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

 mycontext.Person.AddObject(person);
 mycontext.SaveChanges();
检查EDM:storegeneratedPatteren=None中的学生实体pid属性。很困惑

仍然与标识规范有关的是标识、标识增量、要添加到的表的标识种子,或者关系映射到的表列。“ReferentialConstraint中的依赖属性映射到存储生成列”错误显示:

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

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


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

即使我附加了person,也会出现相同的错误。在学生表中,pid是主键和外键。不确定是不是因为这个。@KentZhou…对不起,我不明白学生桌是一对一的关系。您是否使用每类型表继承?我没有使用任何继承,因为两个表中都有一些重复的列名,。只需遵循默认EF并在EDM中创建两个实体。如果学生表中pid上没有creaet键,则此表将没有键,并且可以由EF或Readonly建模。然后您需要先插入此人谢谢帮助。我按照你的建议试过了,但还是在学生身上犯了同样的错误。