【问题标题】:Can't insert data to with EF with Master-detail relationship无法使用具有主从关系的 EF 插入数据
【发布时间】:2011-02-22 02:11:15
【问题描述】:

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

【问题讨论】:

    标签: entity-framework-4


    【解决方案1】:

    听起来你有一个学生,这是一种人。如果这是真的,那么您应该考虑使用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();
    

    【讨论】:

    • 即使我附加了人,我仍然得到同样的错误。在学生表中,pid 是主键和外键。不知道是不是因为这个。
    • @KentZhou ...对不起,我不明白学生表是一对一的关系。您是否使用 Table per type 继承?
    • 我没有使用任何继承,因为两个表中都有一些重复的列名。只需遵循默认的 EF 并在 EDM 中创建两个实体。如果student表的pid上没有creaet key,这个表就没有key,可以用EF或Readonly建模。
    • 那你需要先插入人
    • 感谢您的帮助。我按照您的建议尝试了,但学生仍然遇到同样的错误。
    【解决方案2】:

    检查 EDM 中的学生实体 pid 属性:storegeneratedPatteren = None。很困惑。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多