Pregunta

Con el código primero EF4 (usando CTP5) Puedo añadir una sola propiedad de navegación junto con la clave externa y que va a respetar la denominación y sólo añadir la clave externa a la tabla una sola vez. Pues si yo voy y añadir una segunda propiedad del mismo tipo, que se descompone en 4 columnas en la tabla en lugar de sólo dos.

Código de ejemplo:

Con este modelo, me sale una sola propiedad añadido a la tabla de AdapterFrameCapability PressType llamado PressTypeID.

public class AdapterFrameCapability
{
    [Key]
    public int AdapterFrameCapabilityID { get; set; }

    [Required]
    public int PressTypeID { get; set; }

    public virtual PressType PressType { get; set; }
}

Esta es la configuración que quiero modelo, pero se traduce en 4 columnas que se crean en la tabla, uno por cada uno de FromPressTypeID, FromPressTypeFromPressTypeID, ToPressTypeID y ToPressTypePressTypeID. Lo ideal sería igual que una columna para FromPressTypeID y ToPressTypeID. ¿Qué estoy haciendo mal aquí?

public class AdapterFrameCapability
{
    [Key]
    public int AdapterFrameCapabilityID { get; set; }

    [Required]
    public int FromPressTypeID { get; set; }

    [Display(Name = "From Press Type")]
    public virtual PressType FromPressType { get; set; }

    [Required]
    public int ToPressTypeID { get; set; }

    [Display(Name = "To Press Type")]
    public virtual PressType ToPressType { get; set; }
}
¿Fue útil?

Solución

Es uno de de esos escenarios que se necesita para desplegar API fluida para obtener el esquema deseado:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<AdapterFrameCapability>()
                .HasRequired(afc => afc.FromPressType)
                .WithMany()
                .HasForeignKey(afc => afc.FromPressTypeID)
                .WillCascadeOnDelete(true);

    modelBuilder.Entity<AdapterFrameCapability>()
                .HasRequired(afc => afc.ToPressType)
                .WithMany()
                .HasForeignKey(afc => afc.ToPressTypeID)
                .WillCascadeOnDelete(false);
}

Eliminar en cascada de conmutación apagado en una de las asociaciones es intencional porque lo contrario SQL Server sería tirar el siguiente error:

Presentación de restricción de clave externa 'AdapterFrameCapability_ToPressType' en 'AdapterFrameCapabilities' de mesa puede causar ciclos o múltiples trayectorias de la cascada. Especificar ON DELETE NO ACTION ON UPDATE o ninguna acción, o modificar otras restricciones de clave externa. No se pudo crear la restricción.

Así que tenemos que apagarlo en una de las asociaciones como la manera que lo hice en el código.

Otros consejos

pensé que se supone que debe utilizar el atributo de anotación de datos

[ForeignKey("FromPressTypeId")]

etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top