流畅的API映射

时间:2012-11-29 21:20:48

标签: entity-framework entity-framework-5 fluent-interface

我有一个数据库,其中有三个表格结构如下:

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应该看起来像Entity Framework的以下版本:

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

任何人都可以提供的任何帮助都会得到内心的赞赏。

2 个答案:

答案 0 :(得分: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");
            });
        }
    }

答案 1 :(得分:0)

我明白了。数据库结构和我的实体模型之间存在逻辑上的脱节。

productImages表支持* -1映射,因此Products 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类中配置这种关系(作为parent / mater表中的Products),直到它从ProductImages类配置它才有效,所以我的两个开放式问题是:

1)什么规则决定哪个实体驱动关系配置?

2)有没有办法可以将Products POCO类配置为具有ICollection Images属性并绕过ProductImage实体,因为ProductImage仅用作​​产品和图像之间的链接表?