我有一个名为Products的表,显然包含产品。 但是,我需要创建相关产品。所以我所做的就是创建一个名为product_related的联结表,它有两个PK。 Products表中的ProductID和Products表中的RelatedID。
我已经使用EF并在其他表上设置了所有内容。我应该如何正确添加它以便与产品建立关系:
product.Products.Add(product object here)
。当然,product
代表我使用db.Products.FirstOr...
从数据库中获取的产品对象。
我该如何正确地做到这一点?同桌的多对多人?
感谢。
答案 0 :(得分:79)
为了与数据库优先方法建立多对多关系,您需要设置遵循某些规则的数据库模式:
Products
表,其中ProductID
列为主键ProductRelations
和列ProductID
创建RelatedID
表,并将两列标记为主键(复合键)ProductRelations
表格添加任何其他列。两个键列必须是表中唯一的列,以便EF将此表识别为多对多关系的链接表Products
表作为主键表,ProductID
作为主键,ProductRelations
表作为外键表,只有表ProductID
作为外键 Products
表作为主键表,ProductID
作为主键,ProductRelations
表作为外键表,仅 RelatedID
作为外键 如果您从这两个表中生成实体数据模型,那么您将获得仅一个实体,即Product
实体(如果禁用单一化,则可能为Products
) 。链接表ProductRelations
不会作为实体公开。
Product
实体将具有两个导航属性:
public EntityCollection<Product> Products { get { ... } set { ... } }
public EntityCollection<Product> Products1 { get { ... } set { ... } }
这些导航集合是相同多对多关系的两个端点。 (如果您想要通过多对多关系链接两个不同的表,比如表A
和B
,则一个导航集合(Bs
)将位于实体{{ 1}}和另一个(A
)将在实体As
中。但由于您的关系是“自引用”,因此两个导航属性都在实体B
中。)
这两个属性的含义是:Product
是与给定产品相关的产品,Products
是引用给定产品的产品。例如:如果关系意味着产品需要其他产品作为制造零件并且您拥有“笔记本”,“处理器”,“硅芯片”产品,则“处理器”由制成 “硅芯片”(“硅芯片”是Products1
产品实体的Products
集合中的元素)并且 使用“笔记本”(“笔记本”是Processor
产品实体的Products1
集合中的元素。名称Processor
和Products
不再是Products1
和MadeOf
,而是更合适。
如果您只对关系的一方感兴趣,则可以安全地从生成的模型中删除其中一个集合。只需删除模型设计器表面中的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; }
}
希望这会有所帮助!!!