2012-10-12 7 views
10

[Required]属性をEntity Frameworkの複合型に定義する必要があります。たとえば、私は、エンティティを持っています(オプション:Address)。 Addressエンティティには、必要なPostCodeプロパティがあります。任意のEntity Framework複合型の必須プロパティ

[ComplexType] 
public class Address { 
    public string Address1 { get; set; } 
    [Required] 
    public string PostCode { get; set; } 
} 

public class Customer { 
    public int CustomerId {get;set;} 
    public Address Address {get;set;} 
} 

私は別のエンティティとしての私の複合型を保管する必要はありません(私は実際にアドレスを使用していないよ、この問題のちょうど簡単なイラスト)。私は空の住所エンティティを指定した場合

Null value for non-nullable member. Member: 'Address'.

、検証が必要なため属性の郵便番号フィールドに失敗します。これはエラーになりますので、私は、Customer.Addressのヌルを残すことはできません。

これを達成する方法はありますか?私はEF5/NET4.5を使用しています。

答えて

8

複合型では不可能です。あなたがそれがヌル可能であることを望むなら、あなたはAddress実体を作成する必要があります。

複雑なタイプでEFが行うことは、プロパティを同じテーブルにマップすることです。これは意図したように聞こえます。そのための

- あなたの例のためのスキーマは、次のようになります。それは、データベース内の無効なので、Address_PostCodeための非NULL可能列で

enter image description here

をEFがするための方法はありませんあなたのオブジェクトが住所と郵便番号を持たない行を作成してください。

+0

本当に別のエンティティなしでこれを行うことを望んでいました。私はちょっと違ったバリデーションをしなければならないと思います。とにかく私の疑惑を確認してくれてありがとう! – Richard

+0

これはEFの本当に悪い特徴です。 Addressオブジェクトでリフレクションを使用すると、EFはテーブル作成時に作成する列を簡単に作成できます。それを動作させるためにエンティティからAddressのインスタンスを持つ必要はありません。エンティティの作成/更新時に、ComplexTypeプロパティがnullの場合、データベースのこれらのカラムをnullに設定するのは難しいでしょうか?これは、EF IMOの次のバージョンに追加される簡単な機能です。 – Ibraheem