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);
如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步