По конвенция EF6 представлява взаимоотношенията едно към едно, използвайки така наречения Споделена асоциация на първичен ключ , където PK на зависимия обект също служи като FK на основния обект.
Във вашия случай той взема предвид Account.Id
да бъде FK към Customer
, и тъй като е автоматично генериран, получавате въпросното изключение.
Допълнителният проблем е, че EF6 не поддържа връзка едно към едно с изрично свойство FK (няма HasForeignKey
плавен API, подобен на релациите "един към много").
Така че трябва да премахнете AccountId
от модела и оставете само свойството за навигация. Освен това, въпреки че не е много необходимо, би било добре да следвате конвенциите за именуване и просто да го наричате Account
вместо AccountValue
.
С други думи, замени
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
с
public virtual Customer Customer { get; set; }
Името на FK колоната може да бъде указано с помощта на MapKey
свободен API:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
И сте готови.
Сега следното правилно вмъква първо нов Customer
и след това нов Account
препращайки към него:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();