2016-04-16 6 views
0

Bitte lesen Sie diese Frage: Create code first, many to many, with additional fields in association tableComposite-Keys und getrennt Identität Key

Hier ist das Szenario von OP:

public class Member 
{ 
    public int MemberID { get; set; } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public virtual ICollection<Comment> Comments { get; set; } 
} 

public class Comment 
{ 
    public int CommentID { get; set; } 
    public string Message { get; set; } 

    public virtual ICollection<Member> Members { get; set; } 
} 

public class MemberComment 
{ 
    public int MemberID { get; set; } 
    public int CommentID { get; set; } 
    public int Something { get; set; } 
    public string SomethingElse { get; set; } 
} 

Die akzeptierte Antwort war:

public class MemberComment 
{ 
    [Key, Column(Order = 0)] 
    public int MemberID { get; set; } 
    [Key, Column(Order = 1)] 
    public int CommentID { get; set; } 

    public virtual Member Member { get; set; } 
    public virtual Comment Comment { get; set; } 

    public int Something { get; set; } 
    public string SomethingElse { get; set; } 
} 

Gerade jetzt, meine Frage ist: Was ist, wenn ich ein anderes Identitätsfeld wie Guid oder AutoInc int hinzufügen möchte, zum Beispiel:

public int MemberCommentID { get; set; } 

Ich bin nicht darüber diskutieren, es ist die bessere Methode oder nicht, ich will wissen, wie ich es mache?

Ich dachte so etwas wie dieses

public class MemberComment 
{ 
    [Key, Column(Order = 0)] 
    public int MemberCommentID { get; set; } 

    [Key, Column(Order = 1)] 
    public int MemberID { get; set; } 
    [Key, Column(Order = 2)] 
    public int CommentID { get; set; } 

    public virtual Member Member { get; set; } 
    public virtual Comment Comment { get; set; } 

    public int Something { get; set; } 
    public string SomethingElse { get; set; } 
} 

Aber dann wird EF (glaube ich) verwenden, um die drei Felder im Schlüssel, wenn der rechte MemberCommentID ist allein 1 Schlüssel, und MemberID + CommentID ist ein weiterer wichtiger .

Antwort

1

Warum verwenden Sie in diesem Fall keine ForeignKey auf MemberID und CommentID?

public class MemberComment 
{ 
    [Key] 
    public int MemberCommentID { get; set; } 

    [ForeignKey] 
    public int MemberID { get; set; } 
    [ForeignKey] 
    public int CommentID { get; set; } 

    public virtual Member Member { get; set; } 
    public virtual Comment Comment { get; set; } 

    public int Something { get; set; } 
    public string SomethingElse { get; set; } 
} 

Wie Sie es Sie doppelte MemberComment s zu haben, tatsächlich erlauben wird sehen können (das die gleiche Mitglied verbinden und Instanzen Kommentar).

Wenn Sie erzwingen möchten, dass Member und Comment nur einmal verknüpft werden können, dann können Sie es mit Unique Constraint erreichen.

Aber wenn das Ihre Anforderung ist (ein MemberComment für jedes Member Comment-Paar), warum möchten Sie dann einen MemberCommentID Schlüssel hinzufügen?

MemberID, CommentID ist ein perfekter und natürlicher Primärschlüssel, der die ganze Arbeit ohne zusätzliche Felder/Indizes erledigt.

+0

Warum es nicht die Schlüssel MitgliedID + CommentID erzwingt, wenn ich versuche, eine neue MemberComment mit doppelten MemberID + KommentarID, EF wirft keinen Fehler ..:/ –

+0

Ja, ich weiß, es ist perfekt ... der Schmerz eine bestehende Datenbank zu arbeiten und zu pflegen:/ –

+0

@ClickOk So ist es [Code-zuerst-von-Datenbank] (https://msdn.microsoft.com/en-us/library/jj200620.aspx) anstatt Code-zuerst wie es in deiner Frage markiert ist, oder fehlt mir etwas? –

Verwandte Themen