Dengan konvensi EF6 mewakili hubungan satu-ke-satu menggunakan apa yang disebut Asosiasi Kunci Utama Bersama , di mana PK entitas dependen juga berfungsi sebagai FK entitas utama.
Dalam kasus Anda, ini mempertimbangkan Account.Id
menjadi FK untuk Customer
, dan karena dibuat secara otomatis, Anda mendapatkan pengecualian yang dimaksud.
Masalah tambahan adalah bahwa EF6 tidak mendukung hubungan satu-ke-satu dengan properti FK eksplisit (tidak ada HasForeignKey
API lancar mirip dengan hubungan satu-ke-banyak).
Jadi, Anda perlu menghapus AccountId
properti dari model dan hanya menyisakan properti navigasi. Juga, meskipun tidak terlalu diperlukan, akan lebih baik untuk mengikuti konvensi penamaan dan sebut saja Account
daripada AccountValue
.
Dengan kata lain, ganti
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
dengan
public virtual Customer Customer { get; set; }
Nama kolom FK dapat ditentukan menggunakan MapKey
API lancar:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
Dan Anda selesai.
Sekarang yang berikut ini dengan benar memasukkan Customer
baru terlebih dahulu lalu Account
baru referensi itu:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();