2013-05-05 12 views
20

値、なぜ複合型をインスタンス化することがされていること:複合型のみNULL可能特性を持つエンティティフレームワークで複合型の場合は

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

public class Customer { 
    [Key] 
    public int CustomerId {get;set;} 
    public Address Address {get;set;} 
} 

具体的には、そうでない場合宣言とアドレス型の場合、nullable値ではないメンバーのNull値を取得します。Member: 'Address'。 " this questionに従って。

複合型のすべてのプロパティがnullableである限り、エンティティフレームワークでAddressのインスタンスが必要なのはなぜですか? Address1はnullableなので、なぜそれが想定され、null Address1でAddressのインスタンスを作成したかのように、テーブル(および列Address_Address1)と行のnull値を作成できないのはなぜですか?

これを達成するために適用できる属性/設定がありますか?

+0

null演算子を使用するアドレスのメモリが割り当てられていない可能性があります。 –

+2

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

答えて

8

この質問を見るEntity Framework 5 DbUpdateException: Null value for non-nullable member

すべてのプロパティがnullであっても、複合型をインスタンス化する必要があります。

+0

私の場合は、複合型をインスタンス化していませんでした(インスタンスにnullプロパティがありません)。この例外が発生します。 – reddy

8

プロパティがNULL可能であっても、それらを含むクラスはnullではありません。 Address.Address1nullとすることができますが、Address自体をインスタンス化する必要があります。

+0

もちろん、クラスAddressは値型ではないためnullableですが、問題はEF自体とその "複雑なタイプ"の扱いにあります。 – Shautieh

+0

EF複合型に限定されません。 'Address'がnullの場合、null参照例外なしで' Address.Address1'にアクセスすることはできません。私はこの答えが間違って表現されたと認めますが、私は急いでそれを書いた。私はいつかそれを修正するつもりです。 – anaximander

+0

もちろん、Addressが複雑なタイプでない場合(たとえば、ナビゲーションプロパティ)、nullは完全に受け入れられるでしょう。したがって、 "NULL値ではないメンバーのNull値"エラーは、実際には "アドレス"がEFの複合型として宣言されたという事実にリンクしています。 – Shautieh

関連する問題