Domanda

Con il codice prima EF4 (usando CTP5) posso aggiungere una singola proprietà di navigazione insieme alla chiave esterna e sarà rispettare la denominazione e solo aggiungere la chiave esterna alla tabella una sola volta. Se dunque io vado e aggiungi una seconda proprietà dello stesso tipo, si rompe giù in 4 colonne sul tavolo invece di due.

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 modello, ma si traduce in 4 colonne in fase di creazione della tabella, uno ciascuno per FromPressTypeID, FromPressTypeFromPressTypeID, ToPressTypeID e ToPressTypePressTypeID. Idealmente mi piacerebbe proprio come una colonna per FromPressTypeID e ToPressTypeID. Che cosa sto facendo male 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; }
}
È stato utile?

Soluzione

E 'uno di quegli scenari che avete bisogno di discesa fluente 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);
}

Switching eliminazione a catena fuori su una delle associazioni è intenzionale, perché altrimenti SQL Server sarebbe buttare via il seguente errore:

  

Introdurre FOREIGN KEY vincolo 'AdapterFrameCapability_ToPressType' sulla tabella 'AdapterFrameCapabilities' può causare cicli o più percorsi a cascata. Specificare ON DELETE NO ACTION o ON UPDATE NO ACTION, o modificare altri vincoli chiave esterna.   Impossibile creare il vincolo.   

Quindi abbiamo bisogno di spegnerlo su una delle associazioni come il modo in cui ho fatto nel codice.

Altri suggerimenti

ho pensato che tu fossi supponiamo di utilizzare l'attributo di dati di annotazione

[ForeignKey("FromPressTypeId")]

ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top