2009-06-30 1 views
1

Ich habe entschieden, Entity Framework für O/R-Zuordnung und DataAnnotations für die Validierung in meinem Projekt zu verwenden, und ich habe jetzt ein seltsames Problem bei dem Versuch, dies zu implementieren.Überprüfen Sie komplexe Typen mit DataAnnotations

Dies ist, was ich getan habe:

Ich habe folgendes Entitätstyp

Contact 
******* 
Int32 Id (not null, Entity Key) 
Name Name (not null) 
Address Address (not null) 
String Phone 
String Email 

wo Name und Address komplexe Typen sind wie folgt definiert:

Name         Address 
****         ******* 
String First (not null)    String Street (not null) 
String Last (not null)    String ZipCode (not null) 
             String City (not null) 

und die folgenden Klassen befinden sich im selben Namespace wie meine Entitäten:

public class ContactMetadata 
{ 
    [Required] 
    public Name Name { get; set; } 
} 

[MetadataType(typeof(ContactMetadata))] 
partial class Contact { } 

Allerdings, wenn ich ein neues Contact Artikel erstellen, werden die Name und Address Typen mit Instanzen von Name gefüllt und Address wo alle Werte null sind, statt Name und Address mit null Werte selbst. Daher wirft das Required Attribut keine Fehler, obwohl alle Werte null sind. Wie arbeite ich das an?

Antwort

1

So erstellt es Instanzen der Name und Address Objekte wer Eigenschaften sind null? Interessant.

Können Sie den Kindern einfach das Attribut [Erforderlich] zuweisen?

EDIT: Ich weiß, das könnte eine stinkende Art und Weise, dies zu tun in Betracht gezogen werden, aber aus Gründen der Übersichtlichkeit ich Ihre Antwort in die Post bearbeiten, so dass es leichter durch die nächste Person, die Probleme mit diesem zu finden ...

Empfohlene (und angenommen, aber noch nicht getestet) Lösung:

eine benutzerdefinierte Validierung Attribut schreiben, die gegen die null Werte bestätigt.

+0

Genau.Ich habe eine neue Klasse mit dem Namen NameMetadata erstellt, die die gleiche Struktur wie oben verwendet und sowohl den ersten als auch den letzten Namen festgelegt hat, aber das machte keinen Unterschied. –

+0

Es gibt jetzt ein Kopfgeld in dieser Frage - und du bist derjenige, der dir am nächsten kommt ...;) –

+0

Oh, wie traurig, ich habe keine Ahnung. Haben Sie vielleicht versucht, ein benutzerdefiniertes Attribut zu erstellen und den Nullwert dort zu validieren? – blu

1

Stellen Sie sicher, dass die Namen, die in den HTML-Feldern enden, mit den Eigenschaftsnamen der Klasse übereinstimmen.

Zum Beispiel, wenn Sie dies:

public class Contact { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Address Address { get; set; } 
} 

public class Address { 
    public string Street { get; set; } 
    public string City { get; set; } 
    [...] 
} 

Ihre Anrufe an die HTML-Helfer sollte wie folgt aussehen:

<%= Html.TextBox("FirstName") %> 
<%= Html.TextBox("LastName") %> 
<%= Html.TextBox("Address.Street") %> 
<%= Html.TextBox("Address.City") %> 
[...] 
+0

Ich bin noch nicht zum Viewteil gekommen - aber ich werde, und wenn ich das tue, nützliche Informationen. Vielen Dank! –

+0

Danke, das hat mir bei etwas ähnlichem geholfen! – JustinP8

0

Schauen Sie sich dieses Blog-Post complex-dataannotations-validation. Ich denke, das RequiredAssociation-Attribut ist, was Sie brauchen. Möglicherweise müssen Sie es ein wenig für Entity Framework anstelle von LINQ to SQL zwicken.

0

Ich habe gerade mit dem gleichen Problem zu kämpfen. Ich denke, ein halbwegs eleganter Weg, dies zu tun, besteht darin, den primitiven Schlüsseltyp als Eigenschaft zu referenzieren und die Datenannotation darauf zu setzen. Hier ist ein Beispiel mit AddressID als Schlüsselfeld.

public class Contact{ 

[Required] 
public int? AddressIDForValidation{ 
get{return this.Address.AdressID;} 
} 

public Address Address{get;set;} 
} 



public class Address{ 
public int? AddressID{get;set;} 
public string Street{get;set;} 
}