我有一个数据库,其中有三个表格结构如下:
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
任何人都可以提供的任何帮助都会得到内心的赞赏。
答案 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仅用作产品和图像之间的链接表?