2017-09-15 4 views
0

ich Probleme erlebe einen komplexen Typ in Abbildung auf einer Modellklasse (genannt Assignment) mit EntityFramework 6.EF6-Code Erste/Fluent API werfen Fehler mit Komplexe Typen

Ich habe folgendes Assignment Modellklasse (nur die relevanten Mitglieder gezeigt sind):

public class Assignment 
{ 
    private AssignmentDueByInfo _dueIn; 

    public Assignment() { 
     _dueIn = new AssignmentDueByInfo(this) 
    } 

    public virtual AssignmentSettingInfo DueIn 
    { 
     get { return _dueIn; } 
     protected set { _dueIn = value; } 
    } 
} 

wo AssignmentSettingInfo definiert ist als:

public class AssignmentSettingInfo 
{ 
     protected AssignmentSettingInfo(Assignment assignment) 
     { 
      Assignment = assignment; 
     } 

     protected readonly Assignment Assignment; 

     public virtual int? LessonId { get; protected set; } 
     public virtual Lesson Lesson { get; protected set; } 
} 

In Entity 6 Framework I ha habe das folgenden CodeFirst/Fluent API-Mapping für die Assignment Klasse auf eine Tabelle in einer Datenbank:

Property(t => t.DueIn.LessonId).HasColumnName("DueByLessonId"); 

HasOptional(x => x.DueIn.Lesson) 
      .WithMany(x => x.AssignmentsDue) 
      .HasForeignKey(x => x.DueIn.LessonId) 
      .WillCascadeOnDelete(true); 

Die Abbildung den folgenden Fehler zu werfen:

The expression 'x => x.DueIn.Lesson' is not a valid property expression. The expression should represent a property: C#: 't => t.MyProperty'

Warum ist das passiert und wie es sein sollte Fest?

+0

Ich denke, Dies ist EF-Beschränkung - komplexe Typen können keine Navigationseigenschaften enthalten. –

Antwort

0

Schauen Sie sich die Dokumentation (es ist ziemlich alt, aber immer noch gilt):

https://msdn.microsoft.com/en-us/library/bb738472(v=vs.100).aspx

Diese besagt, dass komplexe Typen nicht Navigationseigenschaften enthalten.

Ich denke, das hat mit der Tatsache zu tun, dass sie keine Primärschlüssel haben und sie nicht separat vom Kontext verwaltet werden. Wenn sie keine PK haben und nicht durch den Kontext identifiziert werden können, können sie auch keine Beziehungsenden sein.

0

Sie versuchen, SQL objektorientiert zu machen. Die von Ihnen definierten Klassen, die eine Datenbanktabelle darstellen, sollten POCOs sein: ziemlich einfache Klassen mit nur get- und set-Eigenschaften.

Sie tun viel zu viel mit Feldern. Wenn Sie ein Feld in einer der Tabellenklassen füllen müssen, denken Sie noch einmal nach. Ich habe noch nie ein Beispiel gesehen, bei dem die Klasse, die eine Datenbanktabelle darstellt, ein anderes Feld als eine einfache get/set-Eigenschaft benötigt.

Wenn sich eine der Klassen auf eine andere Klasse bezieht, geschieht dies durch einen Fremdschlüssel, nicht durch this.

Die Klasse Assignment repräsentiert eine Datenbanktabelle. Diese Tabelle soll bestimmte Spalten und Beziehungen zu anderen Tabellen haben, die Fremdschlüssel verwenden. Die Klasse Assignment sollte keine intelligenten Dinge enthalten, die nicht Teil der Tabelle sind.

zum Beispiel sehe ich, dass Assignment hat ein Feld mit dem Namen _dueIn des Typs AssignmentDueByInfo. Außenstehende können auf dieses Feld zugreifen, aber für sie ist dieses Feld kein AssignmentDueByInfo, sondern ein AssignmentSettingInfo.

Entscheiden Sie selbst, welche Spalten die Assignment haben soll.

Gibt es einen Grund, die Spalten für eine AssignmentSettingInfo in einer anderen Tabelle zu setzen? Wenn ich mir Ihren Code ansehe, kann kein AssignmentSettingInfo ohne eine 'Zuweisung and there can't be an Zuweisung AssignmentSettingInfo` sein. Warum also in getrennte Tische?Ein weiteres Problem ist die Beziehung zwischen AssignmentSettingInfo und Lesson. Ist das eine Null oder Eins zu Eins? Follow these guide lines

Wenn Sie ‚Zuordnung and AssignmentSettingInfo` in einer Tabelle setzen würde Ihr Code wie

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

    // every assignment has exactly one AssignmentSettingInfo 
    // use aggregation (in entity framework terms: complextype) 
    public AssignmentSettingInfo AssignmentSettingInfo {get; set;} 
} 

[ComplexType] 
class AssignmentSettingInfo 
{ 
    // Every AssignmentSettingInfo has zero or one Lesson 
    public virtual Lesson Lesson { get; set; } 
} 

Klasse Lektion { public int Id wäre {get; set;}

// relation between Line and AssignmentSettingInfo 
    ... 
} 

ich nicht die Beziehung zwischen Line und AssignmentSettingInfo herausfinden konnte. Besuchen Sie:

Wenn Sie wirklich die AssignmentSettingInfo in einer anderen Tabelle wollen, konfigurieren Sie es als eine Eins-zu-Eins-Verfahren, wie in den Links gezeigt

+0

Der Grund für das Aufteilen von AssignmentSettingInfo ist, dass die Funktionalität dieser Klasse mehr als angezeigt wird und an anderer Stelle wiederverwendet wird. Ich bevorzugte die Komposition über die Vererbung. Eine Menge wurde aus den oben gezeigten Klassen entfernt; Die Felder sind aus einem bestimmten Grund da, aber sie liegen außerhalb des Bereichs der Frage. – Graham

Verwandte Themen