2010-12-13 6 views
12

Przy pierwszym kodzie EF4 (przy użyciu CTP5) mogę dodać pojedynczą właściwość nawigacji wraz z kluczem obcym i będzie ona respektować nazewnictwo i dodawać tylko klucz obcy do stołu za jednym razem. Jeśli następnie przejdę do drugiej właściwości tego samego typu, podzielę ją na 4 kolumny zamiast dwóch.Jak ustawić dwie właściwości nawigacji tego samego typu w Entity Framework

Przykładowy kod:

Z tego modelu, mam jedną właściwość dodawane do tabeli AdapterFrameCapability dla PressType nazwie PressTypeID.

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

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

    public virtual PressType PressType { get; set; } 
} 

Jest to konfiguracja Chcę modelować, ale wynika to w 4 kolumny tworzone w tabeli, po jednym dla FromPressTypeID, FromPressTypeFromPressTypeID, ToPressTypeID i ToPressTypePressTypeID. Idealnie chciałbym po prostu kolumny dla FromPressTypeID i ToPressTypeID. Co ja tu robię źle?

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

Odpowiedz

14

To jeden z tych scenariuszy, które trzeba rozwijanej fluent API aby uzyskać żądany schemat:

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

przełączania kaskady usunąć off na jednym ze stowarzyszeń jest celowe, ponieważ inaczej SQL Server będzie wyrzucić następujący błąd:

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.

Musimy więc wyłączyć to na jednym ze skojarzeń, tak jak to zrobiłem w kodzie.

0

Myślałam, że przypuszczam, aby użyć atrybutu adnotacji dane

[ForeignKey("FromPressTypeId")] 

itp