【问题标题】:Entity Framework, Composite Key doesn't get created实体框架,复合键没有被创建
【发布时间】: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


【解决方案1】:

复合键的关键部分应该是SQL中可以转换为基本类型的类型,Product不能转换为基本类型,但ProductId可以转换为SQL中的int
复合键必须是:

public class GoodsIssueProcess
{

    [Key, Column(Order = 1), MaxLength(128)]
    public string DeliveryNote { get; set; }

    [Key, Column(Order = 2)]
    public int ProductId { get; set; }
}

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多