2010-12-13 15 views
12

使用代碼優先的EF4(使用CTP5)我可以添加一個導航屬性以及外鍵,它將尊重命名並僅添加外鍵到桌上一次。如果我然後添加同一類型的第二個屬性,它將它分解成表格中的4列而不是2列。如何在實體框架中設置相同類型的兩個導航屬性

示例代碼:

在這種模式下,我得到添加到名爲PressTypeID的壓力式的AdapterFrameCapability表的一個屬性。

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

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

    public virtual PressType PressType { get; set; } 
} 

這是我要建模的設置,但它會導致在該表中,每一個FromPressTypeID,FromPressTypeFromPressTypeID,ToPressTypeID和ToPressTypePressTypeID創建4列。理想情況下,我只需要一個FromPressTypeID和ToPressTypeID列。我在這裏做錯了什麼?

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

回答

14

這是那些你需要下拉fluent API方案,以獲得所需要的模式之一:

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

開關級聯的協會之一刪除掉是故意的,因爲否則的SQL Server會拋出了以下錯誤:

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.

所以我們需要像在代碼中那樣關閉其中一個關聯。

0

我還以爲你想使用的數據註解屬性

[ForeignKey("FromPressTypeId")]