【发布时间】:2015-11-17 13:05:37
【问题描述】:
我有以下课程:
public class GoodsIssueProcess
{
[Key, Column(Order = 1), MaxLength(128)]
public string DeliveryNote { get; set; }
[Key, Column(Order = 2)]
public Product Product { get; set; }
}
public class Product
{
// the unique ID of the product
[Key]
public int Id { get; set; }
[Required, MaxLength(36)]
[Index("IX_ArticleNumber", 1, IsUnique = true)]
public string ArticleNumber { get; set; }
}
(为便于阅读而缩写)
如您所见,GoodsIssueProcess 由 Product 和送货单代码(基本上只是一个数字)组成。根据“Key”关键字的规范,我希望得到 ProductId 和 DeliveryNote 的复合主键。然而,我得到的是 DeliveryNote 的普通主键。 Product 列甚至可以获取 Nullable 属性和与 Product 表的外键关系(这很好)。
你知道我做错了什么吗?我还尝试分配以下内容:
[Key, Column(Order = 2), ForeignKey("Product")]
public int ProductId { get; set; }
public virtual Product Product { get; set; }
结果是相同的数据库布局(只有一个主键,没有复合键)。我正在开发 EF 6.0 和 MSSQL Server 2012。
编辑: 停止! - 显然版本 #2 有效(具有公共 int ProductId 的版本)。然而,第一个版本不应该也能正常工作吗?
【问题讨论】:
-
第一个版本不行。如果您不喜欢看到 ProductId 属性,您可以使用私有支持字段和流式接口来映射它并设置密钥(包含流式接口映射的类必须是 GoodsIssueProcess 的内部类)
-
我真的不在乎是否看到 ProductId,但我想了解为什么第一个版本不起作用。是不是因为 Product 不是可以用作主键的 int/string?
-
我不知道 EF 是否喜欢看到声明为键的导航属性。我对数据注释不是太有经验,但我认为它可能只是忽略了导航属性的那些关键要求。
-
键应该是数据库中的一列。导航属性不是数据库中的列。我相信这就是为什么它不起作用
-
实际上索引和主键只能在原始类型上。没有真正的逻辑原因,只是忽略了属性。
标签: c# sql-server entity-framework