2012-04-25 4 views
0

私はUserとFeedbackという2つのエンティティを持っており、ユーザ名フィールドの助けを借りてそれらの間に1対多の関係があります。Code Firstが関係で外部キー制約を有効にすることを防ぐにはどうすればよいですか?

Feedback --> User 
-------- -------- 
username username 

ただし、フィードバックは登録されていないユーザーからのコードであり、フィードバックのユーザー名フィールドはNullです。その場合、フィードバックの追加は、外部キー制約のために失敗します。

リレーションシップの外部キー制約の適用を宣言的にまたはFluent APIを使用して無効にするにはどうすればよいですか? DBが作成されると、デフォルトで有効になります。

ありがとうございました!

+0

:代わりにあなたが流暢APIを使用することができ、データの注釈の代わりに

。 – Chalky

答えて

4

目的に合わせて外部キー制約の適用を無効にする必要はありません。オプションのという1対多の関係(これとは対照的に)と呼ばれる外部キーのNULL値を許可するだけです。 a が必要です外部キーのNULL値を許可しない関係)。

あなたは、このオプションの関係を定義することができ、次の方法:

public class Feedback 
{ 
    public int Id { get; set; } 

    [ForeignKey("User")] 
    public int? UserId { get; set; } 
    public User User { get; set; } 
} 

は、外部キーのNULL可能タイプint?を有する関係はオプションになります。 UserIdという名前の主キープロパティがある場合、[ForeignKey]属性を省略することもできます。これは、Entity Frameworkが、ネーミング規則に基づいてUserナビゲーションプロパティの外部キーとしてUserIdを検出するためです。私もこの正確な質問への答えを探しています

modelBuilder.Entity<Feedback>() 
    .HasOptional(f => f.User) 
    .WithMany() // or WithMany(u => u.Feedbacks) 
    .HasForeignKey(f => f.UserId); 
+1

ありがとうございます。私の主キー(Username)がStringで、nullを許可できない場合はどうなりますか? "public String?Username"を指定すると、次のコンパイルエラーが発生します。タイプ 'string'は、汎用タイプまたはメソッド 'System.Nullable'のパラメータ 'T'として使用するために、 '。 –

+0

@AlexAvrutin: 'String'は参照型なので、デフォルトでは' null'が許されます。 '? 'を追加する必要はありません。 – Slauma

+1

しかし、?を付けないと、デフォルトで有効になっている関係に外部キー制約が適用されます。私はこれを避けたい。親切に言及されたFluent APIメソッドが私をここで助けてくれることを願っていますか? –

関連する問題