2016-10-01 10 views
0

ここで面白いもののビット私は前に出会ったことはありません。我々はそれを作成した理由は、したがって、我々はジャンクションテーブルの上に追加のプロパティを持っていると言うには十分 - 簡潔にするために省略EF6の多対多エンティティ

public class User 
{ 
    public int Id { get; set; } 
} 

public class School 
{ 
    public int Id { get; set; } 
} 

public class UserSchool 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int UserId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int SchoolId { get; set; } 

    [Required] 
    public virtual User User { get; set; } 

    [Required] 
    public virtual School School { get; set; } 
} 

(その他の追加プロパティ:私たちは、手動でアノテーションを使用してEF6で多対多の関係を作成しました

これはうまくいきます。私たちは、流動的なAPIを使用して複雑なキーをマッピングすることはできませんが、それは重要ではありません。本質的には、2つの標準テーブルをジャンクションを介して多対多に結合しました。勝者。

今、我々はまた、多対多として、別のテーブルに接合テーブル(UserSchool)に参加する必要があります。

public class IPAddress 
{ 
    public int Id { get; set; } 

    public string IPAddress { get; set; } 
} 

public class UserSchoolIPAddress 
{ 
    ?? what to put in here 

    public virtual UserSchool UserSchool { get; set; } 

    public virtual IPAddress IPAddress { get; set; } 
} 

私は流暢なAPIマッピングの両方を試してみました命名規則と注釈でIDプロパティを指定する:流暢なAPIマッピングは失敗します。ナビゲーションエンティティのプロパティを使用するのは好きではないと思います。注釈付きのIDバインディングは、テーブルスキーマ上でUserSchoolのプロパティを2度複製し、同期性の問題を引き起こします。

だから、誰もこのシナリオに遭遇して解決策を見つけましたか?

答えて

0

OKだから私はばかです。フレームワークが実際に私のシナリオを処理するように見えますが、プロパティの種類を誤って設定していたので、不一致があったため、EFは新しいプロパティを複製しようとしました。

public class UserSchoolIPAddress 
{ 
    [Key] 
    [Column(Order = 1)] 
    public int UserSchoolUserId { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    public int UserSchoolSchoolId { get; set; } //<-- I had this set to a string for some reason, which broke everything 

    [Key] 
    [Column(Order = 3)] 
    public int IPAddress IPAddressId { get; set; } 

    public virtual UserSchool UserSchool { get; set; } 

    public virtual IPAddress IPAddress { get; set; } 
} 

だから、これは正しく「多くの」最後にFKを使用して第2の接合テーブルを作成します(この場合は、次のよう

多対接合テーブルの完成の定義は、そのためだろうIPAddress)と2つのFKを「ジャンクション」端(UserSchool)に接続し、3つのFKをまとめてこの「スーパージャンクション」上の1つの複合PKにします。よくやったEF!

0

また、あなたは正しい方法であなたのエンティティを設定する場合はEFはあなたのためにそれを作成し、接合テーブルを必要としません。

あなたのユーザーには、多数の学校と多数のユーザーを持つことのできる学校があるユーザーがいます。このモデルを作成して流暢なapiで設定すると、EFはあなたのためにテーブルUserSchoolを作成し、管理する必要はありません(EFがそれを処理します)。たIPAddressについて

私はあなたのモデルを理解している場合、たIPAddressは、単一の学校では、単一のユーザーによって使用されています。あなたのモデルは、いくつかのナビゲーションプロパティを持つことができます。

public class User 
{ 
    public int Id { get; set; } 
    public virtual ICollection<School> Schools {get; set;} 
    public virtual ICollection<IpAddress> IpAddresses {get; set;} 
} 

public class School 
{ 
    public int Id { get; set; } 
    public virtual ICollection<User> Users {get; set;} 
    public virtual ICollection<IpAddress> IpAddresses {get; set;} 
} 

public class IpAddress 
{ 
    public string Id { get; set; } 
    public virtual User User {get; set;} 
    public virtual School School {get; set;} 
} 
+0

私は私の元の質問で述べたように、我々は実際に接合マッピングのプロパティとして追加データを保存する - たとえば、 'UserSchool'オブジェクトは、実際に他の外国付属のキーと権限レベルを持っています。そのため、手動で設定する必要があります。 – Katstevens

関連する問題