sql >> Base de Datos >  >> RDS >> Sqlserver

Entity Framework - One-to-One - ReferentialConstraint se asigna a una columna generada por la tienda

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();