2016-12-05 6 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(ユーザー) チームは、そのチームここ

にすることができ、多くのユーザーを持っているを持っていることは、私はこれらの関係のための私のUserオブジェクトに持っているものである

私はどこか

からTEAM_IDと呼ばれる余分な列を得ていたcodeFirst移行を実行するときに

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

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

は、しかし、私は明示的にそうようにModelBuilderの中の私の関係を次のように述べています

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が関係を特定できないことが間違いありません。アノテーションでそれを行う方法の1つはInversePropertyです。試してみてください:

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

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

EDIT:あなたは(私はそれをしなかったので、しばらくして)それをプレイしているかもしれませんが、あなたはこのような何かを行ってみたいことがあります。

[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

永続属性の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

残念ながら、これは問題を解決していません。ユーザーとチームの間には2つの関係があります。 1)ユーザーにはオプションのチームID があります。2)チームにはチームメンバーのコレクションがあります(関係1に基づいて) 3)TeamLeaderIDはUserのID (別個の関係 –

+0

私はそれらの関係では例外的な何も見ません、それはEFが作られた理由です)。それらのForeignKey属性からコードを整理しましたか? –

関連する問題