2016-05-22 9 views
0

Ich bin auf einem einfachen Projekt arbeiten nur, um sich mit MVC 5 und EntityFramework 6. Ich Tutorials lesen im Internet zur Verfügung (like this one) und ich glaube, ich bin langsam, um es in den Griff zu bekommen, aber da ist etwas, das ich einfach nicht verstehen kann. Lets sagen, dass ich wie zwei einfache Objekte haben nunMVC 5 zusätzliche Spalte für Fremdschlüsselwert in Bezug auf virtuelle Liste

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

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

    } 

und

public class Team 
    { 
    public int ID {get; set;} 

    [Display(Name = "Team Leader")] 
    [ForeignKey("Player")] 
    public int? PlayerID {get; set;} 

    //some other properties 
    public virtual Player Player {get; set;} 
    public virtual ICollection<Player> Players {get; set;} 
    } 

wenn ich Tabellen erstellen in einer lokalen Datenbank auf diesen Modellen basieren, wird eine neue Spalte wird der Spieler-Tabelle hinzugefügt. Die Spalte wird automatisch hinzugefügt und heißt Team_ID. Das ist seltsam, weil ich diese Spalte (TeamID) bereits besitze, aber Entity ignoriert sie irgendwie und fügt ihre eigene hinzu.

Meine Frage ist, was soll ich tun, um zu verhindern, dass Entity diese zusätzliche Spalte hinzufügt (wenn es möglich ist)? Mache ich etwas falsch? Vielleicht liegt es am Team Leader-Fremdschlüssel?

PS1 Bei einigen zusätzlichen Untersuchungen bemerkte ich, dass wenn ich eine Sammlung von 'A'-Objekten in einem' B'-Modell habe und ich keinen Fremdschlüssel von 'B' im 'A' habe Modell die Spalte wird auch automatisch in die 'A' Tabelle hinzugefügt.

P.S.2 Wie ich gelernt habe, löst das Entfernen des Team Leader-Fremdschlüssels das Problem. Aber ich kann diese Navigation nicht entfernen lassen! Was soll ich machen?

+0

Ok, ich hatte Recht über das Team Leader FK. Es scheint, dass die EF wegen dieser zwei FK im Team-Modell verwirrt ist. Deshalb erzeugt es eine Spalte, um sicher zu sein, dass ich Navigationseigenschaften in Playern habe, die sich auf die Players-Sammlung beziehen. Um EF mitzuteilen, dass es schon da ist, habe ich ein [InverseProperty ("Team")] für die Sammlung verwendet. Funktioniert gut. Für mehr über diese Art von Beziehungen gehen [hier] (http://www.entityframeworktutorial.net/code-first/inverseproperty-dataannotations-attribute-in-code-first.aspx) – Arthur

Antwort

0

Mit Konvention Muster Sie können etwas tun:

public int TeamId {get; set;} 
public virtual Team Team {get; set;} 

[ForeignKey] verwenden, sollten Sie es auf virtuelle Eigenschaft wie folgt hinzufügen (nicht auf die ID-Eigenschaft):

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

Dort haben Sie einige Tipps: http://www.entityframeworktutorial.net/code-first/foreignkey-dataannotations-attribute-in-code-first.aspx

+0

Nach dem Tutorial Link i in dem vorgesehenen Frage das Fremdschlüsselattribut kann auch der Eigenschaft hinzugefügt werden (siehe das OfficeAssignment-Modell). Wie auch immer, das löst das Problem nicht. Ich denke, dass die Tabellenbeziehung nicht gut definiert ist, da ich One-to-One und One-to-Many Rareation habe. Deshalb, wenn ich den Team Leader entferne, funktioniert alles. Vielleicht ist Fluet Api eine Lösung? – Arthur

+0

In vielen Fällen ist FluentApi eine Lösung - das wird es auch sein. – Posio

Verwandte Themen