エンティティフレームワークのコードファーストのnull外部キー


107

私が持っているUser< Countryモデル。ユーザーは国に属していますが、どの国にも属していない可能性があります(null外部キー)。

どうすれば設定できますか?国がnullのユーザーを挿入しようとすると、nullにすることはできません。

モデルは次のとおりです。

 public class User{
    public int CountryId { get; set; }
    public Country Country { get; set; }
}

public class Country{
    public List<User> Users {get; set;}
    public int CountryId {get; set;}
}

エラー: A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = Country_Users ]"}


私が間違っている場合、親切に訂正していただけますか。外部キーは、コードの最初のasp.net mvc-5エンティティフレームワークでDEFAULTによってNULLABLEになります。
壊れない2017

1
nullを許容しないようにする場合。「必須」属性で装飾しない場合は、流暢なAPIを使用する必要があります。私は正しいですか?
壊れない2017

2
我々はいずれかを実行しない場合、外部キーはNULL可能にデフォルト設定されます
アンブレイカブル

回答:


165

外部キーをヌル可能にする必要があります。

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}

7
仮想は何をしますか?
Shawn Mclean

32
遅延読み込みには仮想が必要です。
Ladislav Mrnka、2011

2
Virtualは、常に必要とは限らない変更追跡も追加します。バーチャルが欲しいのはコレクションだけですが、YMMVです。
Dan VanWinkle 2012年

1
@TravisJ user.Countryはnullを返します...例外をキャッチする(最適)または使用するif(eww)
SparK

7
また、これはGuidベースのキーでは機能しないようです。(それらは確実にnull可能になりますが、外部キーがnullに設定されたデータベースにレコードを保存すると、自動生成された外部キー制約により失敗します。):-(
BrainSlugs83

8

私はこれを好む(以下):

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    [ForeignKey("CountryId")]
    public virtual Country Country { get; set; }
}

EFがデータベーステーブルに2つの外部キー、CountryIdとCountryId1を作成していたためですが、上記のコードで修正されました。


6

私は今同じ問題を抱えています、私は外部キーを持っています、そして私はそれをnullableとして置く必要があります、あなたが置くべきこの問題を解決するために

    modelBuilder.Entity<Country>()
        .HasMany(c => c.Users)
        .WithOptional(c => c.Country)
        .HasForeignKey(c => c.CountryId)
        .WillCascadeOnDelete(false);

DBContextクラスでは、遅くなってすみませんでした:)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.