实体框架 6 添加属性以联接表
本文关键字:属性 框架 添加 实体 | 更新日期: 2023-09-27 17:56:09
这是场景:我有一个产品表和一个类别表。这种关系是多对多的:一个类别可以有 1 个或多个产品。并且产品可以属于 1 个或多个类别...
代码优先映射如下所示。
public class Product
{
//...additional properties...
public virtual ICollection<Category> AssociatedCategories {get; set;}
}
public class Category
{
//...additional properties...
public virtual ICollection<Product> AssociatedProducts {get; set;}
}
现在,在后台,实体框架将创建一个名为 ProductCategory 的联接表,其中包含列 ProductID 和 CategoryID。真棒。。。。
事情是这样的,我需要引入一个排序顺序...基本上只是一个基数定位指数,但这个数字只存在于产品和品类相遇的关系中。例如,产品 X 在类别 Y 中的排序顺序值可能为"5",但某些产品(X)在类别 Z 中可能具有不同的排序值(例如 10)。
当然,我可以专门为这类事情创建一个实体......但这需要制作一张新桌子...类别 ID、产品 ID 和排序顺序将有 3 列。我真正希望能够做的是利用实体框架已经制作的表......它将在联接表中跟踪产品 ID 和类别 ID。有什么方法可以使用已经存在的表吗?
为此,您需要为联接表创建一个特定的实体。
public class Product
{
//...additional properties...
public virtual ICollection<ProductCategoryXref> AssociatedCategories {get; set;}
}
public class Category
{
//...additional properties...
public virtual ICollection<ProductCategoryXref> AssociatedProducts {get; set;}
}
public class ProductCategoryXref
{
public int ProductId { get; set; }
public int CategoryId { get; set; }
public int SortOrder { get; set; }
// Additional Columns...
public virtual Product Product { get; set; }
public virtual Category Category { get; set; }
}
如果您使用 Fluent API 配置实体,它将如下所示:
public class ProductCategoryXrefMap : EntityTypeConfiguration<ProductCategoryXref>
{
ProductCategoryXrefMap()
{
HasKey(pk => new { pk.ProductId, pk.CategoryId });
HasRequired(p => p.Product).WithMany(p => p.AssociatedCategories).HasForeignKey(fk => fk.ProductId);
HasRequired(p => p.Category).WithMany(p => p.AssociatedProducts).HasForeignKey(fk => fk.CategoryId);
ToTable("ProductCategoryXref");
}
}