2017-05-17 8 views
5

Ich habe ein ASP.NET MVC 5/C# -Projekt. In meinem Projekt habe ich zwei Modelle, Rule und MenuItem. MenuItem hat einen Fremdschlüssel, der auf Rule verweist. Und Rule hat einen Fremdschlüssel, der MenuItem verweist.Verwenden von Entity Framework, wie kann ich einen Fremdschlüssel auf zwei Modellen hinzufügen, um sich gegenseitig zu referenzieren

Paar Dinge erwähnenswert, mein Modell hat ein Präfix in der Modellbezeichnung. Außerdem verwende ich den ersten Ansatz der Datenbank. Hier erhalten werden auch in der Lage sein, die MenuItem mit der erforderlichen Regel erhalten können

Ich möchte mit .Include(...) und ich möchte die Regeln mit dem MenuItem

meine Modelle sind

[Table("Rules")] 
public class PrefixRule 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string Id { get; set; } 

    [ForeignKey("Item")] 
    public int ModuleId { get; set; } 
    public string Name { get; set; } 

    public virtual PrefixMenuItem Item { get; set; } 
} 

[Table("MenuItems")] 
public class PrefixMenuItem 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string Id { get; set; } 

    [ForeignKey("RequiredRule")] 
    public int? RequiredRuleId { get; set; } 
    public string Name { get; set; } 

    public virtual PrefixRule RequiredRule { get; set; } 
} 

jedoch wenn ich versuche, die Menü-Elemente, einschließlich der erforderlichen Regel zu ziehen, bekomme ich folgende Fehler

Eine oder mehrere Validierungsfehler während der Modell erkannt wurden Generation: MenuItem_RequiredRule_Target:: Die Multiplizität ist nicht gültig in der Rolle 'MenuItem_RequiredRule_Target' in der Beziehung 'MenuItem_RequiredRule'. Da die Eigenschaften der abhängigen Rolle nicht die Schlüsseleigenschaften sind, muss die obere Grenze der abhängigen Rolle '*' sein.

Ich glaube dieser Fehler aufgrund der kreisförmigen Referenzen zwischen meinen Modellen. Allerdings muss ich auf beide Eigenschaften zugreifen können.

Wie kann ich dieses Problem beheben?

+0

Wo Ihre Primärschlüssel in Ihre Entitäten sind? 'Da die Eigenschaften der abhängigen Rolle nicht die Schlüsseleigenschaften sind ' – garethb

+0

Ehm ein bisschen abseits des Themas, aber ich schlage vor, Sie verwenden Guids anstelle von Ints für IDs. https://msdn.microsoft.com/en-us/library/system.guid.newguid(v=vs.110).aspx – StuiterSlurf

Antwort

0

Entity Framework sollte intelligent genug sein, um herauszufinden, dass dies 1 zu 0/1 Beziehung ist. Nicht getestet, aber das sollte funktionieren?

public partial class Rule 
{ 
    [Key, ForeignKey("Item")] 
    public string ModuleId { get; set; } 
    public string Name { get; set; } 

    public virtual MenuItem Item { get; set; } 
} 

public partial class MenuItem 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string Id { get; set; } 

    public string Name { get; set; } 

    public virtual Rule RequiredRule { get; set; } 
} 
+0

Nun, es ist nicht so schlau wie du denkst es ist. Dies ist, was ich bekomme '{" Das Hauptende einer Assoziation zwischen den Typen 'Rule' und 'MenuItem' kann nicht bestimmt werden. Das prinzipielle Ende dieser Assoziation muss explizit konfiguriert werden, entweder über die Beziehung fließende API oder Datenannotationen. "} 'Bitte denken Sie daran, dass ich eine Datenbank zuerst verwende –

+0

Entschuldigung, nur ein Modell sollte der Auftraggeber sein. Dies wird getestet. Ich habe bearbeitet. – Ppp

0

Wenn Sie diesen Weg gehen, dann müssen Sie public string Id in der sowohl die Primär- und Fremdschlüssel in der Regeltabelle machen, indem es verziert mit [Key, ForeignKey („PrefixMenuItem“)]

Lesen Sie diesen Artikel für ein volles Beispiel: http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

Aktualisiert Beispiel:

public partial class Rule 
{ 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key, ForeignKey("Item")] 
    public string Id { get; set; } 

    [ForeignKey("Module")] 
    public int ModuleId { get; set; } 
    public string Name { get; set; } 

    public virtual MenuItem Item { get; set; } 
    public virtual Module Module { get; set; } 
} 

public partial class MenuItem 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public string Id { get; set; } 

    public string Name { get; set; } 

    public virtual Rule RequiredRule { get; set; } 
} 

public partial class Module 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int ModuleId { get; set; } 

    public string Name { get; set; } 

} 
+0

Ich erhalte den Fehler '{" Kann die Reihenfolge der zusammengesetzten Primärschlüssel für den Typ 'MenuItem' nicht bestimmen. Verwenden Sie das ColumnAttribute (siehe http://go.microsoft.com/fwlink/?LinkId=386388) oder die HasKey-Methode (siehe http : //go.microsoft.com/fwlink/?LinkId=386387), um eine Reihenfolge für zusammengesetzte Primärschlüssel anzugeben."}' Ich habe bereits einen 'Schlüssel' in beiden meinen Modellen, der' Id' ist –

+0

Hast du versucht, es zu korrigieren, indem du der Empfehlung folgst? Die Spaltenordnungsdekoration zu den Elementen hinzuzufügen, die deine Schlüssel haben? [Spalte (Order = 0) ] –

+0

ja, das gab mir einen anderen Fehler –

Verwandte Themen