Por convención, EF6 representa las relaciones uno a uno usando el llamado Asociación de clave principal compartida , donde el PK de la entidad dependiente también sirve como FK para la entidad principal.
En su caso, considera Account.Id
ser el FK para Customer
, y dado que se genera automáticamente, obtiene la excepción en cuestión.
El problema adicional es que EF6 no admite una relación uno a uno con la propiedad FK explícita (no hay HasForeignKey
API fluida similar a las relaciones de uno a muchos).
Por lo tanto, debe eliminar el AccountId
propiedad del modelo y dejar solo la propiedad de navegación. Además, aunque no es muy necesario, sería bueno seguir las convenciones de nomenclatura y simplemente llamarlo Account
en lugar de AccountValue
.
En otras palabras, reemplazar
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }
public virtual Customer CustomerValue { get; set; }
con
public virtual Customer Customer { get; set; }
El nombre de la columna FK se puede especificar usando MapKey
API fluida:
modelBuilder.Entity<Customer>()
.HasRequired(c => c.Account)
.WithRequiredPrincipal(a => a.Customer)
.Map(m => m.MapKey("CUSTOMER_ID")); // <--
Y listo.
Ahora lo siguiente inserta correctamente primero un nuevo Customer
y luego una nueva Account
haciendo referencia a él:
var account = new Account
{
AccountNumber = "00123456",
Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();