7

Ich benutze Entity Framework 5 in der Datenbank First Ansatz und ich benutze edmx Datei.Basisklasse/Entity in EntityFramework 5.0

Die meisten meiner Entitäten haben 6 gemeinsame Felder. Felder wie CreatedAt, CreatedBy usw. Jetzt habe ich einige Funktionen als Erweiterungen implementiert, die nur auf IQueryable jener Entitäten, die die gemeinsamen Felder haben, angewendet werden können. Aber wenn ich die Erweiterungsmethode implementiere, kann auf jeden Typ von IQueryable zugegriffen werden, da es Typ T ist und ich kann nur definieren, dass der Typ T immer von einem Typ sein sollte.

Also dachte ich, ich kann den Entitäten eine Basisklasse geben, die gemeinsame Felder hat und Typ T als diesen Basistyp definiert. Aber es scheint, ich kann das nicht tun.

Haben Sie eine Idee, wie Sie das lösen oder das umsetzen, was ich oben erklärt habe?

Antwort

8

Erstellen Sie keine Basisklasse. Erstellen Sie eine Schnittstelle, wie unten:

public interface IMyEntity 
{ 
    DateTime CreatedAt { get; set; } 
    string CreatedBy { get; set; } 
    // Other properties shared by your entities... 
} 

Dann Ihre Models so sein wird:

[MetadataType(typeof(MyModelMetadata))] 
public partial class MyModel : IMyEntity 
{ 
    [Bind()] 
    public class MyModelMetadata 
    { 
     [Required] 
     public object MyProperty { get; set; } 

     [Required] 
     public string CreatedBy { get; set; } 
    } 
} 
+0

Dank: ted von Entity Framework dann nicht automatisch generierte Klasse aussehen würde. Also, wenn ich die Schnittstelle außerhalb der EDMX-Datei definieren. dann werde ich der Entität sagen, dass sie von dieser Schnittstelle aus implementieren soll. Es ist nicht einfach, alle erforderlichen Entitäten manuell zu bearbeiten, da ich sie beim Aktualisieren der EDMX-Datei erneut durchführen muss. – Amila

+2

Sie berühren den automatisch generierten Code nicht. Dafür sollten teilweise Klassen verwendet werden. Sie erstellen für jede Entität in EF eine Teilklasse (im Ordner "Modelle"). Dort können Sie einen MetadataType für Ihre Modelle definieren (für die Annotation von Daten). Siehe die aktualisierte Antwort. – ataravati

+0

Ja, ich verwende momentan MetadataType. Aber dachte, es könnte ein einfacher Weg sein, dies zu tun, d.h. wie eine Basisklasse einer Entität zu geben, wäre es besser gewesen, wenn es erlaubt hätte, auch eine Schnittstelle innerhalb des Diagramms zu geben. Wie auch immer, es ist so, als ob ich die Partialklasse für alle Entitäten definieren müsste. Vielen Dank für Ihre schnelle Hilfe – Amila

2

Ich bin ein Fan von

public interface IShared 
{ 
    DateTime CreatedOn { get; set; } 
} 

public interface ISharedValidation 
{ 
    [Required] 
    DateTime CreatedOn { get; set; } 
} 


public interface IMyEntity: IShared 
{ 
    // Entity Specifics 
    string Username { get; set; } 
} 

public interface IMyEntityValidation: ISharedValidation 
{ 
    [Required] 
    string Username { get; set; } 
} 

Dann Ihre Modelle werden wie folgt:

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
    public object CreatedOn { get; set; } 
    public string Username { get; set; } 
} 

Wenn T4 Genera

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
} 

Typischerweise it is not recommended to use Bind in Asp.Net MVC. für Ihre schnelle Antwort,