50

我有一个名为 Products 的表,其中显然包含产品。但是,我需要创建相关产品。所以我所做的是创建一个名为 product_related 的联结表,它有两个 PK。Products 表中的 ProductID 和 Products 表中的 RelatedID。

我已经使用 EF 并在其他表上设置了所有内容。我应该如何正确添加它以便与产品建立关系: product.Products.Add(product object here). 当然,这里product代表我使用从数据库中获取的产品对象db.Products.FirstOr...

我应该如何正确地做到这一点?多对多到同一张桌子?

谢谢。

4

2 回答 2

89

为了使用Database-First 方法创建多对多关系,您需要设置遵循某些规则的数据库模式:

  • 创建以ProductsProductID为主键的表
  • 创建一个ProductRelations包含一列ProductID和一列的表,RelatedID并将两列都标记为主键(复合键)
  • 不要在表中添加任何其他ProductRelations。两个关键列必须是表中唯一的列,才能让 EF 将此表识别为多对多关系的链接表
  • 在两个表之间 创建两个外键关系:
    • 第一个关系将Products表作为主键表,ProductID主键作为主键,ProductRelations表作为外键表,ProductID作为外键
    • 第二个关系也有Products作为主键的表ProductID作为主键表和只有作为外键ProductRelations的表作为外键表RelatedID
  • 为两个关系中的第一个启用级联删除。(你不能对两者都这样做。SQL Server 不允许这样做,因为它会导致多个级联删除路径。)

如果您现在从这两个表生成实体数据模型,您将只得到一个实体,即一个Product实体(或者Products如果您禁用单数化)。链接表ProductRelations不会作为实体公开。

Product实体将有两个导航属性

public EntityCollection<Product> Products { get { ... } set { ... } }
public EntityCollection<Product> Products1 { get { ... } set { ... } }

这些导航集合是同一个多对多关系的两个端点。(如果您有两个不同的表,您想通过多对多关系链接,例如 tableAB,一个导航集合 ( Bs) 将在 entityA中,另一个 ( As) 将在 entity 中B。但是因为您的关系是“self -reference”两个导航属性都在实体中Product。)

这两个属性的含义是:Products是与给定产品相关的产品,Products1是指给定产品的产品。例如:如果关系意味着一个产品需要其他产品作为零件来制造,并且您有产品“笔记本电脑”、“处理器”、“硅芯片”,那么“处理器”“硅芯片”(“Silicon芯片”是产品实体Products集合中的一个元素)并由一个“笔记本”使用(“笔记本”是产品实体集合中的一个元素)。代替and的名字and会更合适。ProcessorProducts1ProcessorProductsProducts1MadeOfUsedBy

如果您只对关系的一侧感兴趣,则可以安全地从生成的模型中删除其中一个集合。Products1只需在模型设计器界面中删除例如。您还可以重命名属性。关系仍然是多对多的。

编辑

正如评论中所问的那样,使用Code-First 方法的模型和映射将是:

模型:

public class Product
{
    public int ProductID { get; set; }

    public ICollection<Product> RelatedProducts { get; set; }
}

映射:

public class MyContext : DbContext
{
    public DbSet<Product> Products { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Product>()
            .HasMany(p => RelatedProducts)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("ProductID");
                m.MapRightKey("RelatedID");
                m.ToTable("product_related");
            });
    }
}
于 2012-09-08T13:14:05.243 回答
0

让我们举个例子:

相关表格

  Related_id      PK
  Related_name
  Date

产品

  Product_id      PK
  Related_id      FK
  Product_Name
  Date

如何在 EF 中表示它

相关模型类命名为 RelatedModel

  [Key]
  public int Related_id { get; set; }

  public string Related_name {get;set}

  public Datetime Date{get;set;}

产品模型类命名为 ProductModel

   [Key]
  public int Product_id { get; set; }

  public string Product_name {get;set}

  public string Related_id {get;set}

  public Datetime Date{get;set;}

  [ForeignKey("Related_id ")]      //We  can also specify here Foreign key
  public virtual RelatedModel Related { get; set; } 

这样我们就可以在两个表之间创建关系

现在在多对多关系的情况下,我想在这里举另一个例子

假设我有一个模型类Enrollment.cs

public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public decimal? Grade { get; set; }
    public virtual Course Course { get; set; }
    public virtual Student Student { get; set; }
}

这里CourseID 和 StudentId是两个外键

现在我有另一个类Course.cs,我们将在其中创建多对多关系。

public class Course
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public int Credits { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

希望这会有所帮助!!!

于 2012-09-12T12:24:37.963 回答