2010-12-13 19 views
12

Con código primero EF4 (usando CTP5) Puedo agregar una sola propiedad de navegación junto con la clave externa y respetará el nombre y solo agregará la clave externa a la mesa una sola vez. Si luego voy y agrego una segunda propiedad del mismo tipo, la divide en 4 columnas sobre la mesa en lugar de solo dos.¿Cómo puedo configurar dos propiedades de navegación del mismo tipo en Entity Framework

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 desea modelar, pero resulta en 4 columnas que se crean en la tabla, uno por cada uno de FromPressTypeID, FromPressTypeFromPressTypeID, ToPressTypeID y ToPressTypePressTypeID. Lo ideal es que me gustaría 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; } 
} 

Respuesta

14

Es uno de esos escenarios que usted necesita para desplegar fluent API 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); 
} 

conmutación eliminación en cascada fuera en una de las asociaciones es intencional porque lo contrario SQL Server haría tirar el siguiente error:

Introducing FOREIGN KEY constraint 'AdapterFrameCapability_ToPressType' on table 'AdapterFrameCapabilities' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint.

Entonces, debemos apagarlo en una de las asociaciones como lo hice en el código.

0

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

[ForeignKey("FromPressTypeId")] 

etc.

Cuestiones relacionadas