EntityFramework同桌多对多关系

时间:2012-09-02 16:18:54

标签: c# asp.net sql entity-framework

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

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

我该如何正确地做到这一点?同桌的多对多人?

感谢。

2 个答案:

答案 0 :(得分:79)

为了与数据库优先方法建立多对多关系,您需要设置遵循某些规则的数据库模式:

  • 创建一个Products表,其中ProductID列为主键
  • 使用列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 { ... } }

这些导航集合是相同多对多关系的两个端点。 (如果您想要通过多对多关系链接两个不同的表,比如表AB,则一个导航集合(Bs)将位于实体{{ 1}}和另一个(A)将在实体As中。但由于您的关系是“自引用”,因此两个导航属性都在实体B中。)

这两个属性的含义是:Product是与给定产品相关的产品,Products是引用给定产品的产品。例如:如果关系意味着产品需要其他产品作为制造零件并且您拥有“笔记本”,“处理器”,“硅芯片”产品,则“处理器”制成 “硅芯片”(“硅芯片”是Products1产品实体的Products集合中的元素)并且 使用“笔记本”(“笔记本”是Processor产品实体的Products1集合中的元素。名称ProcessorProducts不再是Products1MadeOf,而是更合适。

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

修改

正如评论中所述,使用代码优先方法的模型和映射将是:

型号:

Products1

映射:

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

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

答案 1 :(得分: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; }
}

希望这会有所帮助!!!