2

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

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

次のエンティティタイプがあります

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

ここでName、 とAddressは次のように定義された複合型です。

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

そして、次のクラスは私のエンティティと同じ名前空間に存在します:

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

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

ただし、新しいContactアイテムを作成すると、Nameandの型は、値自体を持つandではなく、すべての値がであるandAddressのインスタンスで満たされます。したがって、すべての値が であっても、属性はエラーをスローしません。これを回避するにはどうすればよいですか?NameAddressnullNameAddressnullRequirednull

4

4 に答える 4

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") %>
[...]
于 2009-06-30T04:25:59.123 に答える
1

では、プロパティが null である Name および Address オブジェクトのインスタンスを作成しますか? 面白い。

子に [Required] 属性を付けることはできますか?

編集:これは臭い方法と見なされる可能性があることはわかっていますが、明確にするために、回答を投稿に編集して、これに問題がある次の人が簡単に見つけられるようにします...

提案された(そして受け入れられたが、まだテストされていない)解決策:

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

于 2009-06-30T03:26:10.267 に答える
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;}
}
于 2011-05-28T17:48:46.263 に答える
0

このブログ投稿complex-dataannotations-validation を確認してください。RequiredAssociation 属性が必要だと思います。LINQ to SQL ではなく、Entity Framework 用に少し調整する必要があるかもしれません。

于 2009-07-30T16:33:24.170 に答える