2010-06-08 16 views
10

Ich habe das Entity Framework mit VS2010 verwendet, um eine einfache Personenklasse mit den Eigenschaften firstName, lastName und email zu erstellen. Wenn ich DataAnnotations wie in diesem blog post anhängen möchte, habe ich ein kleines Problem, weil meine Personenklasse dynamisch generiert wird. Ich könnte den dynamisch generierten Code direkt bearbeiten, aber jedes Mal, wenn ich mein Modell aktualisieren muss, wird der gesamte Validierungscode gelöscht.Verwenden von DataAnnotations mit Entity Framework

Der erste Instinkt war, eine partielle Klasse zu erstellen und Annotationen anzuhängen, aber es beschwert sich, dass ich versuche, die Eigenschaft neu zu definieren. Ich bin mir nicht sicher, ob Sie in C# ähnliche Funktionsdeklarationen in C++ machen können. Wenn du könntest, könnte das die Antwort sein. Hier ist ein Ausschnitt von dem, was ich versuchte:

namespace PersonWeb.Models 
{ 
    public partial class Person 
    { 
    [RegularExpression(@"(\w|\.)[email protected](\w|\.)+", ErrorMessage = "Email is invalid")] 
    public string Email { get; set; } 
    /* ERROR: The type 'Person' already contains a definition for 'Email' */ 
    } 
} 
+0

Ich bin wirklich enttäuscht, dass Sie eine Teilklasse nicht definieren und mit Datenanmerkungen dekorieren können, wie Sie in Ihrem Codebeispiel zeigen. Das war mein erster Instinkt; dann bin ich auf diesen Beitrag gestoßen und sehe keine Lösungen, die mir sympathisch erscheinen. Das ef-Team sollte einen Mapping-Mechanismus bereitstellen, um diese eher lästige Idiosynkrasie zu umgehen. – nocarrier

Antwort

24

Eine Kumpel-Klasse ist mehr oder weniger die Richtung Ihres Code-Snippet unterwegs ist, außer Ihrer manuell codierten Teil Klasse Person würde eine innere Klasse, wie:

[MetadataType(typeof(Person.Metadata))] 
public partial class Person { 
    private sealed class MetaData { 
     [RegularExpression(...)] 
     public string Email { get; set; } 
    } 
} 

Oder Sie könnten Ihre manuell Teil Person Klasse und eine separate Meta-Klasse wie:

[MetadataType(typeof(PersonMetaData))] 
public partial class Person { } 

public class PersonMetaData { 
[RegularExpression(...)] 
public string Email; 
} 

Dies sind Abhilfen und ein zugeordnetes Presentation Klasse aufweisen, können besser geeignet sein.

+0

Würdest du so freundlich sein, die von dir erwähnte "abgebildete Präsentationsklasse" näher zu erläutern? –

+0

Sicher. Ich hätte wahrscheinlich View Model statt Presentation Class sagen sollen. Der Link in Craig Stuntz Kommentar unten hat ein Beispiel. Außerdem: http://stackoverflow.com/questions/2859618/should-i-map-a-domain-object-to-a-view-model-using-an-optional-constructor http://stackoverflow.com/questions/8298401/patterns-for-mapping-data-zwischen-domain-models –

3

Sie müssen entweder eine Metadaten „Buddy“ Klasse verwenden oder (meine Vorliebe) project onto a presentation model instead of binding views directly to entities.

+0

Können Sie etwas detailliertere Informationen zu Ihrem Ansatz für Metadaten-Buddy-Klassen geben? Ich würde es bevorzugen, wenn der Präsentationscode und die Validierung eine Trennung von Bedenken hätten. – dcompiled

+0

"Mein Ansatz" zu "Buddy" -Klassen ist es, sie nicht zu benutzen. Wie gesagt, ich benutze Präsentationsmodelle. Wenn Sie * echte * Trennung von Sorgen wollen, ist das der richtige Weg. –

+0

Es ist nur eine Frage des Stils, ich denke, dass der gesamte Validierungscode und die zugehörigen Metadaten ausschließlich im Modell verbleiben sollten. Es scheint, dass Sie lieber den Validierungscode mit dem Präsentationsmodell mischen möchten. – dcompiled

Verwandte Themen