Theo quy ước, EF6 đại diện cho các mối quan hệ một-một sử dụng cái gọi là Liên kết khóa chính được chia sẻ , trong đó PK của thực thể phụ thuộc cũng đóng vai trò là FK đối với thực thể chính.
Trong trường hợp của bạn, nó coi là Account.Id
trở thành FK cho Customer
và vì nó được tạo tự động, bạn sẽ có ngoại lệ được đề cập.
Vấn đề bổ sung là EF6 không hỗ trợ mối quan hệ 1-1 với thuộc tính FK rõ ràng (không có HasForeignKey
API thông thạo tương tự như mối quan hệ một-nhiều).
Vì vậy, bạn cần xóa AccountId
thuộc tính từ mô hình và chỉ để lại thuộc tính điều hướng. Ngoài ra, mặc dù không quá cần thiết, nhưng sẽ rất tốt nếu bạn tuân theo các quy ước đặt tên và chỉ cần gọi nó là Account
thay vì AccountValue
.
Nói cách khác, thay thế
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
với
public virtual Customer Customer { get; set; }
Tên cột FK có thể được chỉ định bằng cách sử dụng MapKey
API thông thạo:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
Và bạn đã hoàn thành.
Bây giờ, phần sau sẽ chèn một cách chính xác trước tiên một Customer
mới và sau đó là Account
mới tham chiếu nó:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();