2016-07-08 7 views
0

Ich frage mich, ob es möglich ist, eine Tabelle mit vielen zu machen.Entity Framework Eins-zu-Null mit verschiedenen Tabellen

Das ist, was ich habe jetzt (Arbeits Eins-zu-Null-oder-eins-Beziehung zwischen Report und ReportHeader):

public class Report 
{ 
    public int Id {get; set;} 
    public ReportHeader ReportHeader {get; set;} 

    [ForeignKey("ReportHeader")] 
    public int ReportHeaderId {get; set;} 
} 

public class ReportHeader 
{ 
    [Key, ForeignKey("Report")] 
    public int Id {get; set;} 

    public Report Report {get; set;} 
} 

An dieser Stelle möchte ich Tabelle mit dem Namen Style-Report hinzuzufügen, sondern auch auf Tabelle ReportHeader. So würden die Beziehungen wie folgt aussehen:

Report 
|--ReportHeader 
| |-- Style 
| 
|-- Style 

Danach werden die Klassen sollte folgendermaßen aussehen:

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

    public ReportHeader ReportHeader {get; set;} 
    public Style Style {get; set;} 

    [ForeignKey("ReportHeader")] 
    public int ReportHeaderId {get; set;} 

    [ForeignKey("Style")] 
    public int StyleId {get; set;} 
} 

public class ReportHeader 
{ 
    [Key, ForeignKey("Report")] 
    public int Id {get; set;} 

    [ForeignKey("Style")] 
    public int StyleId {get; set;} 

    public Report Report {get; set;} 
    public Style Style {get; set;} 
} 

Das ist so viel Spaß ..., bis es über die Style Klasse denken kommt. An dieser Stelle habe ich keine Ahnung, wie ich es gestalten soll. Ist es überhaupt möglich, diese Klasse in zwei Relationen mit verschiedenen Tabellen zu bringen?

public class Style 
{ 
    // ??? 
    //[Key, ForeignKey("Report"), ForeignKey("ReportHeader")] 
    public int Id {get; set;} 

    public ReportHeader ReportHeader {get; set;} 
    public Report Report {get; set;} 
} 
+0

Was die Beziehungen zwischen Bericht-Style und Report-Style erwünscht ist ? –

+0

Nun, Ihr 'Style' muss zwei (optionale) FK-Beziehungen haben - eine zu' Report' und die andere zu 'ReportHeader'. Fügen Sie also zwei FK-Spalten und entsprechend zwei Navigationseigenschaften für diese beiden Referenzen hinzu. –

+0

@Slava Utesinov Bericht-Stil 1: 1, ReportHeader-Stil 1: 0..1 –

Antwort

0

In diesem Fall sollten Sie Maske die gewünschte Beziehung: one-to-one als many-to-one:

public BaseClass 
{ 
    //indeed, collection always will have zero or one items 
    public virtual ICollection<Style> styles {get; set;} 

    [NotMapped] 
    public Style style { 
     get { return styles.FirstOrDefault(); } 
     set { styles.Add(value); }; 
    } 
} 

public class Report : BaseClass 
{ 
    //other stuff... 
} 

public class ReportHeader : BaseClass 
{ 
    //other stuff... 
} 

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

    public virtual Report report {get; set;} 
    [Index(IsUnique = true)]//to ensure that relation is exactly one-to-one 
    public int? reportId {get; set;} 

    public virtual ReportHeader reportHeader {get; set;} 
    [Index(IsUnique = true)]//to ensure that relation is exactly one-to-one 
    public int? reportHeaderId {get; set;} 
} 
Verwandte Themen