在 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 中使用引用字段作为实体键的一部分的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework 4.1 Code First,一对一,一个表连接到复合键的单个键字段