在 EF 4.1 中使用引用字段作为实体键的一部分

Posted

技术标签:

【中文标题】在 EF 4.1 中使用引用字段作为实体键的一部分【英文标题】:Using reference fields as part of entity key with EF 4.1 【发布时间】:2011-08-08 14:12:44 【问题描述】:

我正在使用实体框架构建我的数据层,并尝试将实体的引用字段放入该实体的键中。

使用 VS2010、.NET 4、EF 4.1、CodeFirst 方法。

鉴于所有这些信息,请考虑以下代码示例:

public class Customer

    [Key]
    [Column(Order = 0)]
    public int SetID  get; set; 
    [Key]
    [Column(Order = 1)]
    public int CustomerId  get; set; 
    public string CustomerName  get; set; 


public class Product

    [Key]
    [Column(Order = 0)]
    public int SetID  get; set; 
    [Key]
    [Column(Order = 1)]
    public int ProductId  get; set; 
    public string ProductName  get; set; 
 

public class SalesVolume

    [Key]
    [Column(Order = 0)]
    public Product product  get; set; 
    [Key]
    [Column(Order = 1)]
    public Customer customer  get; set; 
    [Key]
    [Column(Order = 2)]
    public DateTime SalesDate  get; set; 
    public double Value  get; set; 

我的所有数据都是按集合组织的,因此 Product 和 Customer 实体中都有 setID 字段。

对于 SalesVolume,我有对 Product 和 Customer 实体的引用,我希望这些引用字段成为我的 SalesVolume 复合主键的一部分。 与我所要求的完全不同,对于上面的代码,EF 生成了下表:

CREATE TABLE [dbo].[SalesVolumes](
    [SalesDate] [datetime] NOT NULL,
    [Value] [float] NOT NULL,
    [product_SetID] [int] NULL,
    [product_ProductId] [int] NULL,
    [customer_SetID] [int] NULL,
    [customer_CustomerId] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [SalesDate] ASC
)

产品和客户参考分别放置在两个字段中,它们不是主键的一部分。

如何告诉 EF 生成只有一个 setID 字段和 PK: (setID, productID, customerID) 的 SalesVolume 表?

谢谢。

【问题讨论】:

尝试在您的 salesvolumes 类中添加外键并在其上添加 key 属性。所以另一个属性称为 Customer_CustomerId、Customer_SetID、Product_SetID 和 Product_ProductID。您仍然可以保留导航属性。 【参考方案1】:

其实你只需要声明外键关系:

public class Customer

    [Key]
    [Column(Order = 0)]
    public int SetID  get; set; 
    [Key]
    [Column(Order = 1)]
    public int CustomerId  get; set; 
    public string CustomerName  get; set; 

    public virtual ICollection<SalesVolume> SalesVolumes get; set;


public class Product

    [Key]
    [Column(Order = 0)]
    public int SetID  get; set; 
    [Key]
    [Column(Order = 1)]
    public int ProductId  get; set; 
    public string ProductName  get; set; 

    public virtual ICollection<SalesVolume> SalesVolumes get; set;
 

public class SalesVolume

    [Key]
    [Column(Order = 0)]
    public Product product  get; set; 
    [Key]
    [Column(Order = 1)]
    public Customer customer  get; set; 
    [Key]
    [Column(Order = 2)]
    public DateTime SalesDate  get; set; 
    public double Value  get; set; 

【讨论】:

以上是关于在 EF 4.1 中使用引用字段作为实体键的一部分的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 4.1 自引用

EF 4.1 复杂关系的实体映射

Entity Framework 4.1 Code First,一对一,一个表连接到复合键的单个键字段

EF 4.1 CodeFirst 与 Guid(不是由 DB/Store 生成)作为 PK

可跟踪实体主键违规 EF 4 问题

mysql 外键的使用