2011-03-29 9 views
3

は現在、私は次のようになりモデルで作業する私のエンティティを持っている:これは良い取り組んでいるが、私はモデルでの外国企業のために、明示的に作成されたIDプロパティを持つCodeFirstの例を見ておくEF4.1 CodeFirstエンティティに外部ID列を明示的に追加すると、外部キー制約の競合が発生するのはなぜですか?

public class MyModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual User User { get; set; } 
} 

。これは理にかなっており、MyModelインスタンスに関連付けられたユーザーのid値を取得するためにユーザーに遅延ロードを行う必要はありません。

私がするMyModelを変更するときしかし、:

public class MyModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public virtual int UserId { get; set; } 
    public virtual User User { get; set; } 
} 

MyModelインスタンスをコミットしようとしたとき、私は次の例外を取得:

System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "MyModel_User". The conflict occurred in database "mjlunittest", table "dbo.Users", column 'Id'. 

は、なぜ私はこの例外を取得していますか?

答えて

4

あなたはEFコードファースト規約は一つの重要な変化を検知する第二の例にMyModelのあなたの最初の例から移動:あなたがモデルに外部キープロパティを持たない拳の場合

を関係MyModel -> User(任意)です。UserMyModelには他のオブジェクトへの参照としてnullを指定できるため、したがって、EF規約では、null可能な外部キー列がデータベースに作成されます。あなたは、外部キーUserIdないNULL可能あるタイプintであるEFを語っている第2のケースで

。したがって、EF規則では、関係MyModel -> Userとして要求し、とし、データベースにInt32列を作成します。

MyModelのオブジェクトを作成する場合は、それをコンテキストに追加して、記述した例外が発生するSaveChangesを呼び出します。外部キーを持つデータベースにユーザーがいなければオブジェクトを作成するときに別の値を指定しない場合は0)。データベースの外部キーがnullであるため、最初のバージョンのオブジェクトを作成して保存してもこの例外はスローされません。

あなたがMyModelの両方の例は、あなたが第二の例では、外部キープロパティNULL可能を作ることができるのいずれかと同じように振る舞うことをしたい場合:

public virtual int? UserId { get; set; } 

を次に関係がMyModelの両方の例でオプションです。

それとも、最初の例で必要Userプロパティを行うことができます。

[Required] 
public virtual User User { get; set; } 

は、その後の関係は、両方の例でを必要とされます。

+0

Ahaは、それがすべて意味があることを再読した後です。ありがとう! – KallDrexx

関連する問題