【问题标题】:Composite Key with EF 4.1 Code FirstEF 4.1 代码优先的复合键
【发布时间】:2011-07-24 21:28:35
【问题描述】:

我正在尝试弄清楚如何使用 EF 代码 First 4.1 RC 获得复合键。

目前,我正在使用 [Key] Data Annotation,但我无法指定多个键。

如何指定复合键?

这是我的例子:

 public class ActivityType
{
    [Key]
    public int ActivityID { get; set; }

    [Required(ErrorMessage = "A ActivityName is required")]
    [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
    public string ActivityName { get; set; }

}

我还需要“ActivityName”作为键。 当然,我可以围绕这个编写代码,但这不是好的数据库设计。

【问题讨论】:

    标签: ef-code-first composite-key entity-framework-4.1


    【解决方案1】:

    您可以使用Key 注释标记ActivityIDActivityName 属性,或者您可以使用@taylonr 描述的流畅API。

    编辑:

    这应该可行 - 使用注释定义的复合键需要明确的列顺序:

    public class ActivityType
    {
        [Key, Column(Order = 0)]
        public int ActivityID { get; set; }
    
        [Key, Column(Order = 1)]
        [Required(ErrorMessage = "A ActivityName is required")]
        [StringLength(50, ErrorMessage = "Activity Name must not exceed 50 characters")]
        public string ActivityName { get; set; }
    
    }
    

    【讨论】:

    • 无论如何添加不是真正键的唯一约束/索引?
    【解决方案2】:

    我们不使用注释,而是覆盖模型构建器,在这种情况下,您可以执行以下操作:

    modelBuilder.Entity<Activity>().HasKey(a => new { a.ActivityId, a.ActivityName });
    

    【讨论】:

    • 这确实有效,但我希望有一个有效的注释。有 CTP 4 的样本,但这些不再在 4.1 RC 中工作
    • 我知道您正在寻找注释,但认为这可能有助于搜索...就像我说我们没有使用注释所以我没有太多帮助...希望你找到答案
    • 我喜欢这种方法。保持模型没有上下文问题。谢谢。
    • 有人知道使用fluent api设置复合主键是否适用于SQL CE?它对我不起作用(给出“EntityType ...未定义键”的错误),我不确定是否创建新问题。
    • 如果你模拟你的 DbContext 用于单元测试,你如何确保执行模型构建器以定义实体和/或复合主键之间的关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2018-02-13
    相关资源
    最近更新 更多