2012-08-07 63 views
6

我在個人ASP.NET MVC 3項目上使用EF代碼優先(4.3.1),具有非常簡單的領域模型,而且我幾乎處於EF將按照我希望的方式生成數據庫模式。實體框架代碼優先 - 虛擬財產列命名

域模型有兩個類:PaintingGallery。每個Painting屬於一個單獨的Gallery,並且Gallery有兩個虛擬屬性指向Painting:一個用於指示該繪畫是封面圖片,還有一個是主頁上顯示的Slider圖片。

這些類如下。我已經刪除了一些註釋和不相關的屬性以使其可讀。

public class Gallery 
{ 
    public Gallery() 
    { 
     Paintings = new List<Painting>(); 
    } 

    [ScaffoldColumn(false)] 
    [Key] 
    public int GalleryId { get; set; } 

    public string Name { get; set; } 

    [ScaffoldColumn(false)] 
    [Column("LaCover")] 
    public Painting Cover { get; set; } 

    [ScaffoldColumn(false)] 
    [Column("ElSlider")] 
    public Painting Slider { get; set; } 

    [ScaffoldColumn(false)] 
    public virtual List<Painting> Paintings { get; set; } 
} 

和繪畫:

public class Painting 
{ 
    [ScaffoldColumn(false)] 
    [Key] 
    public int PaintingId { get; set; } 

    public string Name { get; set; } 

    public int GalleryId { get; set; } 

    [Column("GalleryId")] 
    [ForeignKey("GalleryId")] 
    [InverseProperty("Paintings")] 
    public virtual Gallery Gallery { get; set; } 

    public string Filename { get; set; } 
} 

它產生兩個類及其關係的正確DB模式,唯一的小問題,我是,我還沒有找到一種方法來控制列名它給出Gallery表中的CoverSlider的虛擬屬性。

它會將它們命名爲Cover_PaintingIdSlider_PaintingId

我試過使用[Column("columnNameHere")]屬性,但這根本不影響它。正如「我輸入了一個非相關的單詞並且它沒有出現在模式中」。

我想給它命名CoverPaintingId,沒有下劃線。

任何幫助,非常感謝。謝謝

回答

6

ForeignKey屬性允許您定義,如果你想讓它在模型中存在,這將作爲你的外鍵行動的性質:

[ForeignKey("CoverPaintingId")] 
public virtual Painting Cover { get; set; } 
public int? CoverPaintingId { get; set; } 

注意,你可以把屬性無論是在對國外的虛擬財產鍵 - 只需要指定「另一個」的名稱。

但是,因爲您將在同一組實體之間有兩個關係,所以如果不禁用其中一個或兩個的級聯刪除,您將無法做到這一點。這隻能使用Fluent Configuration API完成。

public class Gallery 
{ 
    public int GalleryId { get; set; } 

    [ForeignKey("CoverPaintingId")] 
    public virtual Painting Cover { get; set; } 
    public int? CoverPaintingId { get; set; } 

    [ForeignKey("SliderPaintingId")] 
    public virtual Painting Slider { get; set; } 
    public int? SliderPaintingId { get; set; } 

} 

public class Painting 
{ 
    public int PaintingId { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Gallery> Galleries { get; set; } 
    public DbSet<Painting> Paintins { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Gallery>().HasOptional(g => g.Cover).WithMany().WillCascadeOnDelete(false); 
     modelBuilder.Entity<Gallery>().HasOptional(g => g.Slider).WithMany().WillCascadeOnDelete(false); 
    } 
} 

如果你不想讓外鍵的屬性在代碼模型中存在,你也可以通過使用.Map(...)之前配置這些。 WillCascadeOnDelete(false) API的一部分而不是使用ForeignKey。我喜歡使用外鍵,但如果你想這樣做代碼如下:

public class Gallery 
{ 
    public int GalleryId { get; set; } 
    public virtual Painting Cover { get; set; } 
    public virtual Painting Slider { get; set; } 
} 

public class Painting 
{ 
    public int PaintingId { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Gallery> Galleries { get; set; } 
    public DbSet<Painting> Paintins { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Gallery>().HasOptional(g => g.Cover).WithMany().Map(m => m.MapKey("CoverPaintingId")).WillCascadeOnDelete(false); 
     modelBuilder.Entity<Gallery>().HasOptional(g => g.Slider).WithMany().Map(m => m.MapKey("SliderPaintingId")).WillCascadeOnDelete(false); 
    } 
} 
+0

我曾嘗試過,理查德,但我收到以下錯誤: 引入FOREIGN KEY約束'FK_Galleries_Paintings_CoverPaintingId'表'圖庫'可能會導致週期或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 無法創建約束。查看以前的錯誤。 – GR7 2012-08-07 18:38:42

+0

啊,是的,忘了你會得到多重關係。更新了答案以解釋如何解決這個問題。 – Richard 2012-08-07 18:48:42

+0

理查德。取得了一些進展,謝謝,但現在我收到以下錯誤:'ap.Models.Gallery'類型的屬性'封面'上的ForeignKeyAttribute無效。在依賴類型「ap.Models.Painting」上未找到外鍵名'CoverPaintingId'。名稱值應該是逗號分隔的外鍵屬性名稱列表。 從錯誤說,我明白我必須在繪畫上創建一個CoverPaintingId屬性?這不是我想要的,因爲我只想將已經在Gallery上創建的列命名爲「CoverPaintingId」而不是「Cover_PaintingId」 – GR7 2012-08-07 18:56:10

0

你可以嘗試使用[inverseproperty]裝飾來實現這一點。

+0

Clot,我相信是當你有倒轉的關係,並告訴EF不創建雙FK關係。我實際上是使用它,但對於Gallery類中的Paintings屬性。 InverseProperty不適用於我想要做的事情。我確實需要圖庫中的這些列,我只是想以不同的方式命名它們。 – GR7 2012-08-07 18:26:12