2010-12-13 9 views
12

Mit Code zuerst EF4 (mit CTP5) Ich kann eine einzige Navigationseigenschaft zusammen mit dem Fremdschlüssel hinzufügen und es wird die Benennung respektieren und nur den Fremdschlüssel hinzufügen zum Tisch ein einziges Mal. Wenn ich dann gehe und eine zweite Eigenschaft desselben Typs hinzufüge, zerlegt sie sie in 4 Spalten in der Tabelle statt nur zwei.Wie kann ich zwei Navigationseigenschaften des gleichen Typs in Entity Framework einrichten

Beispielcode:

Mit diesem Modell bekomme ich eine einzige Eigenschaft auf die AdapterFrameCapability Tabelle hinzugefügt für PressType genannt PressTypeID.

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

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

    public virtual PressType PressType { get; set; } 
} 

Dies ist die Setup ich modellieren möchten, aber es ergibt 4 Spalten in der Tabelle erstellt werden, jeweils eine für FromPressTypeID, FromPressTypeFromPressTypeID, ToPressTypeID und ToPressTypePressTypeID. Im Idealfall möchte ich nur eine Spalte für FromPressTypeID und ToPressTypeID. Was mache ich hier falsch?

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

Antwort

14

Es ist eines dieser Szenarien, die Sie fluent API fallen müssen Sie die gewünschte Schema zu erhalten:

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

Kaskadenschaltung auf einem der Verbände löschen ausgeschaltet ist gewollt, weil sonst SQL Server würde werfen den folgenden Fehler:

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.

Also müssen wir es bei einer der Assoziationen ausschalten, so wie ich es im Code getan habe.

0

Ich dachte, Sie die Daten Anmerkung Attribut

[ForeignKey("FromPressTypeId")] 

usw. zu verwenden, nehme wurden

Verwandte Themen