2010-01-06 11 views
8

Ich versuche, ein Projekt mit Entity Framework 4, POCO und Nur-Code einzurichten.Verwendung einer Schnittstelle mit einer Navigationseigenschaft

Ist es im Entity-Framework für den Typ einer Navigationseigenschaft möglich, eine Schnittstelle zu sein?

Ich habe eine "Task" -Klasse. Ein Task kann einem Benutzer oder einer Gruppe zugewiesen werden, die jeweils durch eine separate Klasse repräsentiert und in separaten Tabellen gespeichert sind. Die Klassen in etwa so aussehen:

public class User : IAssignable 
{ 
    public String Name { get; set; } 
    public int ID { get; set; } 
    public String Email { get; set; } 
    public String Password { get; set; } 
} 

public class Group : IAssignable 
{ 
    public String Name { get; set; } 
    public int ID { get; set; } 
    public String Manager { get; set; } 
    public String Department { get; set; } 
} 

public class Task 
{ 
    public String Title { get; set; } 
    public DateTime DueDate { get; set; } 
    public String Details { get; set; } 
    public IAssignable AssignedTo { get; set; } 
} 

Gibt es eine Möglichkeit der AssignedTo Eigenschaft als Navigationseigenschaft in Entity Framework zu können? Ich nehme an, dass es eine Art von Diskriminator für EF geben muss, um zu wissen, ob er in der Tabelle Benutzer oder in der Tabelle Gruppen suchen muss, aber ich kann das Mapping mit Code-Only oder EDMX herausfinden.

+0

Ich bin auch an einer Lösung interessiert. – Ciel

Antwort

0

Mit dem von EF4 unterstützten Text Template Transformation Toolkit (T4) können Sie sich viel Arbeit ersparen. Ich fand diese eine nach gut 12 Stunden nach einem Weg, um meine POCOs und Schnittstellen manuell zu erstellen,

http://blogofrab.blogspot.com/2010/08/maintenance-free-mocking-for-unit.html

Neben eine brillante Basis für Unit-Tests bereitstellt, es generiert automatisch Navigationseigenschaften auf die Beziehungen auf der Grundlage in Ihrem Modell definiert.

1

Ich weiß, dass dies eine alte Frage, aber nein, es gibt kein Merkmal des Entity Framework ist (sogar die neueste Version 6), mit der Sie eine Navigationseigenschaft mit einem Schnittstellentyp zuordnen können.

Sie könnten jedoch mehrere Navigationseigenschaften mit konkreten Typen (und einer Einschränkung, von denen nur eine festgelegt werden kann) zuordnen und eine nicht zugeordnete Eigenschaft Ihres Schnittstellentyps bereitstellen, die die konkreten Navigationseigenschaften zu einer einzigen Eigenschaft zusammenführt. Leider können dadurch Ihre Abfragen komplexer werden, da bestimmte Abfragen wissen müssen, auf welche konkreten Navigationseigenschaften verwiesen werden soll (und Sie können keine Abfragen für Ihre nicht zugeordnete Schnittstelleneigenschaft durchführen).

Die Unterstützung für polymorphe Navigationseigenschaften ist sehr komplex. Überlegen Sie, was passieren würde, um Ihre ursprüngliche AssignedTo-Eigenschaft abzufragen, wenn Sie annehmen, dass sie einer Spalte wie AssignedToId int zugeordnet ist. Sie müssten die Entity-Sets User und Group entweder zusammenführen oder beitreten und hoffen, dass ein gegebenes AssignedToId in nur einem von ihnen erscheint. Dies ist der Ansatz, der von der Typzuordnung verwendet wird, aber er funktioniert nur mit der Klassenvererbung (nicht mit Schnittstellen) und sorgfältiger Planung zum Generieren bestimmter IDs über die beteiligten Typen.

Verwandte Themen