Kunci asing nol kode kerangka kerja entitas

107

Saya memiliki User< Countrymodel. Seorang pengguna milik suatu negara, tetapi mungkin bukan milik mana pun (kunci asing nol).

Bagaimana cara menyiapkannya? Ketika saya mencoba memasukkan pengguna dengan negara nol, itu memberi tahu saya bahwa itu tidak bisa nol.

Modelnya adalah sebagai berikut:

 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;}
}

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

Shawn Mclean
sumber
Bisakah Anda mengoreksi saya jika saya salah. Kunci asing NULLABLE oleh DEFAULT dalam kode pertama asp.net mvc - 5 kerangka entitas.
dipecahkan
1
Jika kita ingin membuatnya menjadi non nullable. kita perlu menggunakan api yang lancar jika tidak, lalu hiasi dengan atribut "Diperlukan". Apakah saya benar?
dipecahkan
2
Jika kita tidak melakukan keduanya maka kunci Asing akan disetel ke Nullable
Unbreakable

Jawaban:

165

Anda harus menjadikan kunci asing Anda nullable:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}
Ladislav Mrnka
sumber
7
apa yang dilakukan virtual?
Shawn Mclean
32
Virtual diperlukan untuk pemuatan lambat.
Ladislav Mrnka
2
Virtual juga menambahkan pelacakan perubahan, yang tidak selalu diinginkan. Tentang satu-satunya saat kita menginginkan virtual ada di koleksi, tetapi YMMV.
Dan VanWinkle
1
@TravisJ user.Country mengembalikan null lalu ... menangkap pengecualian (optimal) atau menggunakan if(eww)
SparK
7
Juga - ini sepertinya tidak berfungsi untuk Guidkunci berbasis. (Itu membuat mereka nullable, tentu, tetapi menyimpan record ke database dengan kunci asing yang disetel ke null gagal karena batasan kunci asing yang dibuat secara otomatis.) :-(
BrainSlugs83
8

Saya lebih suka ini (di bawah):

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

Karena EF membuat 2 kunci asing di tabel database: CountryId, dan CountryId1, tetapi kode di atas memperbaikinya.

pengguna1040323
sumber
6

Saya memiliki masalah yang sama sekarang, saya memiliki kunci asing dan saya perlu menaruhnya sebagai nullable, untuk mengatasi masalah ini Anda harus meletakkannya

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

di kelas DBContext saya minta maaf karena terlambat menjawab Anda :)

Yaman Melhem
sumber