2014-02-18 28 views
0

這裏是我的兩個模型和我得到的asp.net mvc5 codefirst此錯誤時更新,數據庫無法確定類型之間的關聯的主要終點錯誤

錯誤:無法確定委託人結束的類型'ModulericaV1.Areas.Hr.Models.HrDepartment'和'ModulericaV1.Areas.Hr.Models.HrPerson'之間的關聯。該關聯的主要目的必須使用關係流暢API或數據註釋來顯式配置。

DEPARTMENT

public class HrDepartment 
    { 
     [Key] 
     public int Id { get; set; } 

     [Display(Name = "Departman Adı")] 
     public string Name { get; set; } 

     public int? HrDepartmentId { get; set; } 

     [ForeignKey("HrDepartmentId")] 
     public virtual HrDepartment RelatedDepartment { get; set; } 

     public int HrPersonId { get; set; } 
     public virtual HrPerson HrPerson { get; set; } 

    } 

PERSON

public class HrPerson 
    { 
     public int Id { get; set; } 
     [Display(Name = "Ad")] 
     public string Name { get; set; } 

     [Display(Name = "Departman")] 
     public int HrDepartmentId { get; set; } 
     public virtual HrDepartment HrDepartment { get; set; } 

    } 

回答

2

您必須覆蓋OnModelCreating你的DbContext的方法。 嘗試是這樣的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<HrDepartment>().HasRequired(a=>a.HrPerson).WithRequiredDependent(b=>b.HrDepartment); 
} 

或本:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<HrDepartment>().HasRequired(a=>a.HrPerson).WithRequiredPrincipal(b=>b.HrDepartment); 
} 

這些居住在在主要終點之間的差異。 我不得不說,我沒有嘗試,只是寫我記得所以可能會有一些錯誤,但做這樣的事情,你將能夠解決這個錯誤。

此外,您還可以設置級聯刪除設置.WillCascadeOnDelete(false)(true爲默認值)。

回答評論問題: 我認爲EF不會創建DB限制,因爲如果兩者都是必需的,那麼您不能插入A,因爲您需要B已經創建(否則檢查失敗),B不能因爲它需要A(出於同樣的原因)而被創建。所以你可以在沒有限制的情況下工作,但是你必須在每次SaveChanges()之前以編程方式檢查或重新設計模型。事實上,我認爲你沒有必需的關係,但是1:N,因爲一個部門必須負責任,但是一個人可以負責零到N個部門。

所以我會做的是:

1)保持HrDep,因爲它是

2)刪除

[Display(Name = "Departman")] 
     public int HrDepartmentId { get; set; } 
     public virtual HrDepartment HrDepartment { get; set; } 

3)

取代

modelBuilder.Entity<HrDepartment>().HasRequired(a=>a.HrPerson).WithRequiredPrincipal(b=>b.HrDepartment); 

modelBuilder.Entity<HrDepartment>().HasRequired(a => a.HrPerson).WithMany().WillCascadeOnDelete(false); 

請注意,在數據庫更新會因爲現有的數據庫結構而出現錯誤,所以最快的方法是刪除數據庫並讓EF重新創建它。

希望這有助於,有一個愉快的一天,

阿爾貝託

+1

第二個是解決謝謝:)但是你可以請解釋更或從一個鏈接或教程如何學習呢? – umki

+0

還有一點,使用此選項,腳手架不會爲部門和部門中的人員創建下拉列表...只有它創建HrPersonId和HrDepartmentId – umki

+0

快速資源:http://msdn.microsoft.com/en-us /data/jj591620.aspx 完整資源:http://www.amazon.com/Programming-Entity-Framework-Julia-Lerman/dp/1449312969和其他書Julia Lerman – Alberto

相關問題