2

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

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

任何人能提供的任何帮助都会得到衷心的感谢。

4

2 回答 2

3

在我开始使用Entity Framework Power Tools之前,我遇到了同样的问题

使用它,您可以生成清晰的实体,如业务对象和映射类。帮助我创建惊人的数据访问层的好文章:逆向工程师代码优先

我认为映射应该如下所示:

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");
            });
        }
    }
于 2012-11-29T22:09:28.587 回答
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 类中配置这种关系(作为父/母表中的产品),直到从 ProductImages 类中配置它才起作用,所以我的两个未解决的问题是:

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

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

于 2012-11-30T16:26:50.230 回答