2016-05-01 7 views
1

Ich habe eine Reihe von Spielern, die über eine FriendLinker Tabelle miteinander verbunden sind.Code zuerst Generierung zusätzlicher Spalten

Die Tabelle verbindet zwei Spieler miteinander (in diesem Fall der Spieler-> Freund). Ich habe den Player-Setup auf folgende Weise:

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; } 
} 

und der Linker Tisch ist Setup wie folgt aus:

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

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

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

Dies ist jedoch die folgende Migration zu erzeugen:

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); 

Die Ergebnis erstellt eine zusätzliche Spalte Player_PlayerId1. Wenn ich player.Friends.add(..) mache, wird die playerId in PlayerId1 eingefügt.

Was soll ich tun, um zu verhindern, dass die zusätzliche Spalte PlayerId1 generiert wird?

Antwort

2

Es geschieht, weil FriendLinker Klasse zwei Links zu Player Klasse, aber Player Klasse hat nur einen Link und EF wenig verwirrt darüber, wodurch zusätzliche Spalte Player_PlayerId1 erscheint in dieser Spalte genau Player (ICollection Eigenschaft verknüpft ist, Deshalb: Wenn ich player.Friends.add (..) mache, wird playerId in PlayerId1 eingefügt.). Zwei andere Spalten, die Sie angegeben haben, werden als implizit mit der Klasse Player verknüpft betrachtet. Sie können das Problem beheben, indem zweiten Link zu FriendLinker Klasse bei Player Klassendeklaration hinzufügen und welche konkreten Eigenschaften dieser Verbindungen angeben, werden mittels InverseProperty Attributs Konstruktor Parameter in Beziehung gesetzt werden:

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; } 
}