2016-05-01 11 views
1

FriendLinkerテーブルを介してリンクされた複数のプレーヤーがあります。コード最初に余分な列を生成する

テーブルは2人のプレーヤー(この場合はプレーヤー - >友人)をリンクします。私は、次のようにプレーヤーを設定している:

public class Player 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key, Column(Order=0)] 
    public Guid PlayerId { get; set; } 

    public virtual ICollection<FriendLinker> Friends { get; set; } 

    [Required] 
    public string Password { get; set; } //Will be switched to byte[] for hash 

    [MaxLength(100)] 
    [Index(IsUnique = true)] 
    public string Username { get; set; } 
} 

とリンカの表は、このような設定である:

public class FriendLinker 
{ 
    [Key] 
    public int FriendLinkerId { get; set; } 

    [Required] 
    public Player Player { get; set; } 

    [Required] 
    public Player Friend { get; set; } 
} 

しかし、これは次の移行を生成している:

CreateTable(
"dbo.FriendLinkers", 
c => new 
{ 
    FriendLinkerId = c.Int(nullable: false, identity: true), 
    Player_PlayerId = c.Guid(), 
    Friend_PlayerId = c.Guid(nullable: false), 
    Player_PlayerId1 = c.Guid(nullable: false), 
}) 
.PrimaryKey(t => t.FriendLinkerId) 
.ForeignKey("dbo.Players", t => t.Player_PlayerId) 
.ForeignKey("dbo.Players", t => t.Friend_PlayerId, cascadeDelete: false) 
.ForeignKey("dbo.Players", t => t.Player_PlayerId1, cascadeDelete: false) 
.Index(t => t.Player_PlayerId) 
.Index(t => t.Friend_PlayerId) 
.Index(t => t.Player_PlayerId1); 

結果は追加の列Player_PlayerId1を作成します。 player.Friends.add(..)を実行すると、playerIdがPlayerId1に挿入されます。

余分な列PlayerId1が生成されないようにするにはどうすればよいですか?

答えて

2

FriendLinkerクラスはPlayerクラスに2つのリンクを持っているので、それは起こるが、Playerクラスが追加の列Player_PlayerId1は、このコラムを正確PlayerICollectionプロパティにリンクされて表示された結果として、1つのリンクのみ、それについてEF少し混乱しています、その理由は:私がplayer.Friends.add(..)を実行すると、playerId1にplayerIdが挿入されます。)。指定した他の2つの列は暗黙的にPlayerクラスにリンクされていると見なされます。あなたはPlayerクラス宣言でFriendLinkerクラスに2つ目のリンクを追加することによって、それを修正して、このリンクはInverseProperty属性のコンストラクタのパラメータによって関連されるまでその具体的なプロパティを指定することができます。

public class Player 
{ 
    [InverseProperty("Player")] 
    public virtual ICollection<FriendLinker> Players { get; set; } 

    [InverseProperty("Friend")] 
    public virtual ICollection<FriendLinker> Friends { get; set; } 

    [Required] 
    public string Password { get; set; } //Will be switched to byte[] for hash 

    [MaxLength(100)] 
    [Index(IsUnique = true)] 
    public string Username { get; set; } 
} 
関連する問題