Por convenção, EF6 representa os relacionamentos um para um usando o chamado Associação de chave primária compartilhada , onde o PK da entidade dependente também serve como FK para a entidade principal.
No seu caso, considera
Account.Id
para ser o FK para Customer
, e como é gerado automaticamente, você obtém a exceção em questão. O problema adicional é que o EF6 não suporta relacionamento um para um com a propriedade FK explícita (não há
HasForeignKey
API fluente semelhante a relacionamentos um-para-muitos). Então você precisa remover o
AccountId
propriedade do modelo e deixe apenas a propriedade de navegação. Além disso, embora não seja muito necessário, seria bom seguir as convenções de nomenclatura e apenas chamá-la de Account
em vez de AccountValue
. Em outras palavras, substitua
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
com
public virtual Customer Customer { get; set; }
O nome da coluna FK pode ser especificado usando o
MapKey
API fluente:modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
E você está feito.
Agora, o seguinte insere corretamente primeiro um novo
Customer
e, em seguida, uma nova Account
referenciando-o:var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();