【问题标题】:Entity Framework 6 Adding properties to join tables实体框架 6 添加属性以连接表
【发布时间】:2014-04-02 18:24:19
【问题描述】:

这是场景: 我有一个产品表和一个类别表。这种关系是多对多的:一个类别可以有 1 个或多个产品....而一个产品可以属于 1 个或多个类别...

Code-First 映射如下所示......

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......有什么办法可以制作使用已经存在的表?

【问题讨论】:

  • 您必须在类模型中创建一个实体,否则 EF 将永远无法读取排序顺序。不用担心。在大多数实际应用中,纯连接表迟早会变成学术抽象。此外,当联结是一个实体时,您可以更有效地操纵关联。
  • 如果您不将其存储在某处,我不确定您打算如何为不同的产品设置排序顺序,因此您需要将该列添加到表中。
  • 谢谢@GertArnold...我很好奇您所说的...“当连接是一个实体时,您可以更有效地操纵关联”...您就是这样谈论类似于 Dismissile 使用 fluent API 发布的内容?
  • 我的意思是您可以自己创建/删除关联记录,即使从未从数据库中获取ProductCategory。对于多对多,您总是需要完整的对象来操作关联。

标签: c# entity-framework e-commerce entity-framework-6


【解决方案1】:

您需要为连接表创建一个特定实体才能执行此操作。

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");
      }
 }

【讨论】:

  • 所以我设法让与您的代码示例类似的东西启动并运行......看起来这样做,它可以使用相同的 JOIN 表......但它会创建重复的条目。 ...一行存储类别到产品关联...一行存储排序顺序到猫/产品关联
  • 感谢@Dismille ....我实际上只是要测试将 Product.AssociatedCategories 和 Category.AssociatedProducts 实现为方法而不是虚拟 ICollection 属性...通过查询反对建议的 ProductCategoryXrefMap 类....我希望它不会对性能产生太大影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多