2009-06-30 22 views
1

O/RマッピングにはEntity Frameworkを使用し、プロジェクトでは検証のためにDataAnnotationsを使用することにしました。これを実装しようとすると奇妙な問題が発生しました。DataAnnotationsで複合型を検証する

これは私がやったことです:

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

そして以下:私は、次のエンティティタイプNameAddressは次のように定義された複合型です

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

を持って

をクラスは私のエンティティと同じ名前空間にあります:

私は新しい Contactアイテムを作成するときに3210
public class ContactMetadata 
{ 
    [Required] 
    public Name Name { get; set; } 
} 

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

はしかし、NameAddressタイプではなくNameAddressnull値そのものを有していると、Nameとすべての値がnullあるAddressのインスタンスで満たされています。したがって、すべての値はnullですが、Required属性はエラーをスローしません。これを回避するにはどうしたらいいですか?

答えて

1

したがって、名前とアドレスのオブジェクトのインスタンスが作成されます。そのオブジェクトのプロパティはnullですか?面白い。

子どもに[必須]属性を設定できますか?

編集:私は、これがこれを行うの臭いの方法と考えられるかもしれないけど、それが簡単にこれで問題を抱えて次の人によって発見することができるように明確にするため、私は、ポストにあなたの答えを編集...

を推奨(と受け入れられたが、まだテストされていない)ソリューション:

null値に対して検証カスタム検証属性を記述します。

+0

正確に。上記と同じ構造を使用してNameMetadataという名前の新しいクラスを作成し、必要な姓と名を設定しましたが、違いはありませんでした。 –

+0

今、この質問には恩恵があります - あなたはどこにでも近づくために最も近い人です...;) –

+0

ああ、悲しい、わかりません。おそらくカスタム属性を作成し、そこにnull値を検証しようとしましたか? – blu

1

HTMLフィールドに終わる名前がクラスのプロパティ名と一致していることを確認してください。

たとえば、あなたはこの持っている場合:

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; } 
    [...] 
} 

をHTMLヘルパーにあなたの呼び出しは次のようになります。

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

私はまだビューの部分には手をつけていませんが、私はそうします。ありがとう! –

+0

ありがとう、これは私に何か似たような助けになりました! – JustinP8

0

このブログ記事complex-dataannotations-validationをチェックしてください。私は、RequiredAssociation属性が必要なものだと思います。 LINQ to SQLの代わりにEntity Frameworkを少し修正する必要があるかもしれません。

0

私は今同じ問題で苦労しています。私はそれを行う半優雅な方法は、キープリミティブ型をプロパティとして参照し、それにデータアノテーションを置くことだと思います。 AddressIDがキーフィールドである例を示します。

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;} 
} 
関連する問題