ReferentialConstraint 中的依赖属性映射到由存储生成的列

在用EF保存一个一对一关系的实体的时候报错:ReferentialConstraint 中的依赖属性映射到由存储生成的列。列为:“DEPARTMENTID”。

现在问题解决了,还原一下现场吧。

模型

复制代码
 public class Department
    {
        public int DepartmentID { get; set; }
        public string Name { get; set; }
        public virtual Course Courses { get; set; }
    }

    public class Course
    {
        public string Title { get; set; }
        public string Credits { get; set; }
        public int DepartmentID { get; set; }
        public virtual Department Department { get; set; }
    }
复制代码
Department与Course是一对一关系(这里权当假设)。
模型配置
复制代码
 public class CourseConfiguration:System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Course>
    {
        public CourseConfiguration()
        {
            HasKey(p => p.DepartmentID);
            Property(p => p.Credits).HasColumnName("CREDITS");
            Property(p => p.DepartmentID).HasColumnName("DEPARTMENTID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(p => p.Title).HasColumnName("TITLE");

            ToTable("COURSE", "GYOUNG");
        }
    }

    public class DepartmentConfiguration : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<Department>
    {
        public DepartmentConfiguration()
        {
            HasKey(p => p.DepartmentID);
            Property(p => p.DepartmentID).HasColumnName("DEPARTMENTID").
                HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(p => p.Name).HasColumnName("NAME");
            HasRequired(p => p.Courses).WithOptional(a => a.Department);
            ToTable("DEPARTMENT", "GYOUNG");
        }
    }
复制代码
注意到Course表中DepartmentID既是关联到Department的外键,同时也是它自己的主键。因为只有这样,一对一关系能配置成功。

如果用上面的配置,执行下面的代码:
复制代码
 Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SampleDB>());
            using (var db = new SampleDB())
            {
                Course cou = new Course() { Title = "Chinese" };
                Department dep = new Department() {Name = "SC" };
                dep.Courses = cou;
                db.Departments.Add(dep);
                db.SaveChanges();
                
                Console.WriteLine("OK");
                Console.ReadKey();
            }
复制代码

保存的时候EF,就会报错:ReferentialConstraint 中的依赖属性映射到由存储生成的列。列为:“DEPARTMENTID”。

解决方法:

HasRequired(p => p.Courses).WithOptional(a => a.Department);

改成

HasOptional(p => p.Courses).WithRequired(a => a.Department);

因为Department才是主体,将其设置为必须。

同时,Courses的主键必须设置为非自增长

Property(p => p.DepartmentID).HasColumnName("DEPARTMENTID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

 

posted @   Gyoung  阅读(1188)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示