2012-11-29 133 views
2

我已經有三個表的數據庫結構如下:流利的API映射

Table 1: Product 
Columns: ProductID, PK 
     SKU,  PK 
     Name 

Table 2: ProductImages 
Columns: ImageID PK 
     SKU 

Table 3: Images 
Columns: ImageID PK 
     ImageContent 

忽略了一會兒該表ProductImages看起來是不同之處在於獨特的PK約束是許多一對多關係強制爲一對一,因此是不必要的一對多表(這是一個現有的數據庫)。

我想有以下POCO實體類:

public class Product 
{ 
    public int ProductId { get; set; } 
    public string SKU { get; set; } 
    public virtual Image Image { get; set; } 
} 

假設Image也是我的實體模型的實體。

我第一次使用Entity Framework 5.0與代碼和Fluent API,我要瘋了試圖找出如何寫ProductMap類(從EntityTypeConfiguration<Product>派生)。具體來說就是關係映射。

渲染的SQL應該像實體框架的版本如下:

select p.SKU, p.Name, p.ProductID, I.ImageID, I.ImageContent 
from Products p 
inner join ProductImages si on p.SKU = si.SKU 
inner join Images i on i.ImageId = si.ImageId 

任何幫助,任何人都可以提供將與心臟得到滿足感到讚賞。

+0

SKU不應該是ProductImages的主鍵嗎?如果是這種情況,那麼您會希望收集產品圖像集合,該圖像集合包含在您的產品類中。 – jfin3204

+0

你不打算這樣做,除非你願意通過告訴它產品只有SKU作爲主鍵來欺騙EF。 (多對多映射是可能的)。但這可能會導致異常,因爲實際上SKU在產品中可能不是唯一的。 –

回答

3

我有同樣的問題,直到我開始使用Entity Framework Power Tools

使用它可以生成清晰的實體,如一個業務對象和映射類。 好文章,幫助我創造出驚人的數據訪問層:Reverse Engineer Code First

,我認爲應該映射看起來像:

public class ProductMap : EntityTypeConfiguration<Product> 
{ 
    public ProductMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.ProductId); 

     // Properties 
     this.Property(t => t.Name) 
      .IsRequired() 
      .HasMaxLength(256); 

     // Table & Column Mappings 
     this.ToTable("Product"); 
     this.Property(t => t.ProductId).HasColumnName("ProductID"); 
     this.Property(t => t.Name).HasColumnName("Name"); 

     // Relationships 
     this.HasMany(t => t.Products) 
      .WithMany(t => t.Images) 
      .Map(m => 
      { 
       m.ToTable("ProductImages"); 
       m.MapLeftKey("ProductID"); 
       m.MapRightKey("ImageID"); 
      }); 
     } 
    } 
+0

謝謝你的回覆。我已經使用這個工具。這兩個問題是Products.SKU - > ProductImages。SKU在數據庫中不存在(因此不能被反向工程化),第二個問題是即使它可以,映射的POCO也將是Products.ProductImages [0] .Image。我需要將這種關係展平爲Products.Image。 –

0

我想通了。數據庫結構和我的實體模型之間存在邏輯上的分離。

productImages表支持* -1映射,因此產品POCO類需要有一個ProductImages集合。然後,需要配置實體如下:

public class ProductImagesMap : EntityTypeConfiguration<ProductImage> 
{ 
     //Other field and key configuration... 

     this.HasRequired(t=>t.Image).WithRequiredDependent(); 

     this.HasRequired(t => t.Product) 
     .WithMany(t => t.ProductImage) 
     .HasForeignKey(d => d.SKU); 
} 

public class ProductImage 
{ 
    public int ImageId { get; set; } 
    public string SKU{ get; set; } 
    public virtual Image Image { get; set; } 
    public virtual Product Product { get; set; } 
} 

public class Product 
{ 
    public Product() 
    { 
     this.Features = new List<Feature>(); 
    } 

    public int ProductId { get; set; } 
    public string Name { get; set; } 
    public string SKU{ get; set; } 
    public virtual Brand Brand { get; set; } 
    public virtual ICollection<ProductImage> ProductImages { get; set; } 
} 

我嘗試配置在ProductMap類這種關係(如產品在父/母校表)掙扎着,但直到從ProductImages類配置它它的工作,所以我的兩個開放的問題是:

1)什麼規則確定哪個實體驅動關係配置?

2)有沒有一種方法可以將產品POCO類配置爲具有ICollection Images屬性並繞過ProductImage實體,因爲ProductImage僅用作​​產品和圖像之間的鏈接表?