Ich habe die folgende Klasse vom Entity Framework generiert:
public partial class ItemRequest
{
public int RequestId { get; set; }
//...
Ich möchte dies zu einem Pflichtfeld machen
[Required]
public int RequestId { get;set; }
Da dies jedoch generierter Code ist, wird dieser gelöscht. Ich kann mir keine Möglichkeit vorstellen, eine Teilklasse zu erstellen, da die Eigenschaft durch die generierte Teilklasse definiert wird. Wie kann ich die Einschränkung sicher definieren?
c#
entity-framework
asp.net-mvc-4
P.Brian.Mackey
quelle
quelle
Antworten:
Die generierte Klasse
ItemRequest
wird immer einepartial
Klasse sein. Auf diese Weise können Sie eine zweite Teilklasse schreiben, die mit den erforderlichen Datenanmerkungen gekennzeichnet ist. In Ihrem Fall würde die Teilklasse folgendermaßenItemRequest
aussehen:quelle
Wie MUG4N beantwortet können Sie verwenden partielle Klassen aber besser genutzt werden Schnittstellen statt. In diesem Fall treten Kompilierungsfehler auf, wenn das EF-Modell nicht dem Validierungsmodell entspricht. So können Sie Ihre EF-Modelle ändern, ohne befürchten zu müssen, dass die Validierungsregeln veraltet sind.
PS Wenn Sie einen Projekttyp verwenden, der sich von ASP.NET MVC unterscheidet (wenn Sie eine manuelle Datenüberprüfung durchführen), vergessen Sie nicht, Ihre Prüfer zu registrieren
quelle
Ich habe eine Lösung wie die Antwort von MUG4N gefunden , aber stattdessen die
MetaData
Klasse innerhalb der Entitätsklasse verschachtelt , wodurch die Anzahl der Klassen in Ihrer öffentlichen Namespace-Liste verringert und die Notwendigkeit beseitigt wurde, für jede Metadatenklasse einen eindeutigen Namen zu haben.quelle
[NotMapped]
innerhalb der Teilklasse hinzu, wenn ich sie benötige.Dies ist eine Art Erweiterung der Antwort von @dimonser. Wenn Sie Ihr Datenbankmodell neu generieren, müssen Sie die Schnittstellen für diese Klassen manuell neu hinzufügen.
Wenn Sie Magen dafür haben, können Sie auch Ihre
.tt
Vorlagen ändern :Hier ist ein Beispiel für die automatische Generierung von Schnittstellen in einigen Klassen. Dies ist ein Fragment aus der
.tt
ErsetzungsmethodeEntityClassOpening
in Ihrer Klasse durch Folgendes (und natürlichvar stringsToMatch
durch Ihre Entitätsnamen und Schnittstellen).Kein normaler Mensch sollte sich das antun, es wurde in der Bibel bewiesen, dass man dafür in die Hölle geht.
quelle
Ich bin mir nicht sicher, wie ich tun soll, wonach Sie fragen, aber es gibt einen Weg, dies zu umgehen. Dynamische Datenüberprüfung durch Überschreiben der GetValidators Ihres benutzerdefinierten DataAnnotationsModelValidatorProvider. Darin können Sie die Regeln für die Validierung jedes Felds (aus einer Datenbank, einer Konfigurationsdatei usw.) lesen und nach Bedarf Validatoren hinzufügen. Es hat den zusätzlichen Wert, dass Ihre Validierung nicht mehr eng mit dem Modell verbunden ist und geändert werden kann, ohne dass die Site neu gestartet werden muss. Natürlich könnte es für Ihren Fall übertrieben sein, aber es war ideal für unseren!
quelle
Ändern Sie die T4-Vorlage, indem Sie die erforderlichen Anmerkungen hinzufügen. Diese Datei heißt normalerweise MODELNAME.tt
Finden Sie heraus, wo der T4 die Klasse und die Methoden erstellt, um zu wissen, wo diese abgelegt werden sollen.
Sie müssen auch die Namespaces hinzufügen.
Erstellen Sie Ihre Klassen neu, indem Sie Ihr Modell speichern. Alle Ihre Methoden sollten mit Anmerkungen versehen sein.
quelle