2010-12-13 15 views
12

Con codice prima EF4 (utilizzando CTP5) Posso aggiungere una singola proprietà di navigazione insieme alla chiave esterna e rispetterà la denominazione e aggiungerò solo la chiave esterna al tavolo una sola volta. Se poi vado e aggiungo una seconda proprietà dello stesso tipo, la suddivide in 4 colonne sul tavolo anziché solo due.Come posso impostare due proprietà di navigazione dello stesso tipo in Entity Framework

codice di esempio:

Con questo modello, ottengo una singola proprietà aggiunta alla tabella AdapterFrameCapability per PressType nome PressTypeID.

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

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

    public virtual PressType PressType { get; set; } 
} 

Questa è la configurazione che voglio a modello, ma si traduce in 4 colonne in fase di creazione della tabella, uno ciascuno per FromPressTypeID, FromPressTypeFromPressTypeID, ToPressTypeID e ToPressTypePressTypeID. Idealmente mi piacerebbe solo una colonna per FromPressTypeID e ToPressTypeID. Cosa sto facendo di sbagliato qui?

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; } 
} 

risposta

14

E 'uno di quegli scenari che avete bisogno di discesa fluent API per ottenere lo schema desiderato:

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

cascata Accensione eliminare off su una delle associazioni è intenzionale, perché altrimenti SQL Server avrebbe buttare via il seguente errore:

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.

Quindi abbiamo bisogno di spegnerlo su una delle associazioni come ho fatto nel codice.

0

pensavo che fossi supponiamo di utilizzare l'attributo di dati di annotazione

[ForeignKey("FromPressTypeId")] 

ecc

Problemi correlati