我需要在一個DbSet.Add調用中插入一個實體與相關實體。EF6 - 僅當通過導航屬性插入具有相關實體的實體時發生錯誤
一對多的課程和CourseProfesor之間(CourseProfesor是實體連接課程和Profesors)
實體:
public class Course
{
public Course() { }
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
...
public virtual ICollection<CourseProfesor> Profesors { get; set; }
}
public class CourseProfesor
{
public CourseProfesor() { }
[Key]
public int ID { get; set; }
[Required, Index, Column(Order = 0)]
public int CourseID { get; set; }
[Required, Index, Column(Order = 1)]
public int ProfesorID { get; set; }
...
[ForeignKey("CourseID")]
public virtual Course Course { get; set; }
[ForeignKey("ProfesorID")]
public virtual Profesor Profesor { get; set; }
}
映射:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Course>().HasMany(x => x.Profesors).WithRequired(x => x.Course);
modelBuilder.Entity<CourseProfesor>().HasRequired(x => x.Course).WithMany(x => x.Profesors);
modelBuilder.Entity<CourseProfesor>().HasRequired(x => x.Profesor).WithMany(x => x.Courses);
}
控制器:
public ActionResult Add(Course course, int profesorId = 0)
{
if (profesor > 0)
{
course.Profesors = new List<CourseProfesor>();
course.Profesors.Add(new CourseProfesor() { Course = course, CourseID = 0, ProfesorID = profesorId, From = DateTime.Now, Role = ... });
}
Facade.Create(course);
return Json(new {statusText = "Course Added"});
}
Facade.Create(實體)執行CreateCommand這將反過來調用
DbContext.Set(entity.GetType()).Add(entity)
的例外,我得到:
到數據庫的更改已成功提交,但在更新時發生錯誤對象上下文。 ObjectContext可能處於不一致的狀態。內部異常消息:發生參照完整性約束衝突:關係一端的'Course.ID'的屬性值與另一端的'CourseProfesor.CourseID'的屬性值不匹配
如果我還不知道課程ID,那麼如何分配CourseProfesor.CourseID,因爲兩者都是新實體?
正如您在控制器代碼中看到的那樣,我曾經通過僅設置導航屬性來解決這個問題,並且EF會相應地自動填充外鍵。
這一點很重要:這是對EF5做工精細,我更新到EF6
任何線索,爲什麼EF6拋出該異常而EF5後仍未得到了錯誤?以及如何解決這個問題,而無需先創建課程,然後創建CourseProfesor關係實體?
你需要建立你的實體映射/配置和實體類。 EF6可以很好地處理這些問題,但是您必須確保它具有關於您的實體關係以及圍繞關鍵生成的規則的足夠信息。 –
謝謝你的提示。我用實體和配置編輯了這個問題。對不起,這是我的第一個問題 – Lucio