2016-12-05 30 views
0
public class Team 
    { 
     public Team() 
     { 
      TeamSchemes = new HashSet<Scheme>(); 
      TeamUsers = new HashSet<PLUser>(); 
     } 

     public int ID { get; set; } 
     public string Name { get; set; } 

     [ForeignKey("Office")] 
     public int OfficeID { get; set;} 
     public virtual Office Office { get; set; } 

     [ForeignKey("TeamLeader")] 
     public int TeamLeaderID { get; set; } 


     public virtual PLUser TeamLeader { get; set; } 
     public virtual ICollection<Scheme> TeamSchemes { get; set; } 
     public virtual ICollection<PLUser> TeamUsers {get;set;} 


    } 

我有一個團隊對象和一個用戶對象。我該如何解決這個問題:System.Data.SqlClient.SqlException:無效的列名'TeamID'

我想要的關係是: 一支球隊擁有一個TeamLeader(用戶) 一支球隊擁有很多用戶,可以在那支球隊

以下是我在我的用戶對象這些關係

 [ForeignKey("Team")] 
     public int? TeamID { get; set; } 
     public virtual Team Team { get; set; } 

     public virtual ICollection<Team> TeamsLeading { get; set; } 

但是運行codeFirst遷移我是從什麼地方

越來越稱爲TEAM_ID一個額外的列時,我明確指出我在模型構建的關係像這樣:

modelBuilder.Entity<Team>().HasRequired(x => x.TeamLeader).WithMany(u=>u.TeamsLeading).HasForeignKey(t=>t.TeamLeaderID); 

modelBuilder.Entity<PLUser>().HasOptional(x => x.Team).WithMany(t=>t.TeamUsers).HasForeignKey(x => x.TeamID); 

modelBuilder.Entity<PLUser>().HasMany(u => u.TeamsLeading).WithRequired(t => t.TeamLeader); 

遷移代碼成功運行並似乎顯示預期結果。但是,當我運行該應用程序時,出現以下錯誤並且該應用程序無法運行:

System.Data.SqlClient.SqlException:列名'TeamID'無效。

/模型上的關係,任何幫助修復問題

回答

1

在您的評論中,EF無法確定關係是正確的。一種使用註釋的方法是InverseProperty。嘗試:

[InverseProperty("Team")] 
public virtual ICollection<PLUser> TeamUsers {get;set;} 

[InverseProperty("TeamLeader")] 
public virtual ICollection<Team> TeamsLeading { get; set; } 

編輯:您可能必須發揮它(已經有一段時間,因爲我做到了),但你可能想要去是這樣的:

[InverseProperty("TeamsLeading")] 
public virtual PLUser TeamLeader { get; set; } 
public virtual ICollection<Scheme> TeamSchemes { get; set; } 
[InverseProperty("Team")] 
public virtual ICollection<PLUser> TeamUsers {get;set;} 
+0

感謝史蒂夫似乎已經解決了這個問題 –

0

persistent屬性ForeignKey的用法是錯在這裏。您正在將其應用於原始值本身。 正確的用法是將其應用於導航屬性,以指示哪些原始屬性存儲其FK值。

在你的情況下,它不是必需的,因爲EF將按照約定解決它:

public class PLUser{   
    public int? TeamID { get; set; } 
    public virtual Team Team { get; set; } 
} 

當EF發現團隊導航屬性,它會嘗試內PLUser找到名爲TeamID或TeamId基本屬性,與與Team類PK相同的類型,將其用作ForeignKey。

+0

不幸的是這並沒有解決問題。我認爲這與用戶和團隊之間有兩種關係有關:1)用戶有可選的團隊ID 2)團隊有TeamUsers的集合(基於關係1) 3)團隊有TeamLeaderID是指用戶的ID (單獨關係 –

+0

我沒有看到與這些關係沒有任何特殊之處,爲什麼EF是爲了;)。你是否從這些ForeignKey屬性中清理了你的代碼? –