EF 4.1代码优先的复合密钥


105

我试图弄清楚如何使用EF代码First 4.1 RC来组合键。

当前,我正在使用[Key]数据注释,但是我不能指定多个键。

如何指定组合键?

这是我的示例:

 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”作为键。当然,我可以对此编码,但是那不是好的数据库设计。

Answers:


186

您可以使用批注标记ActivityIDActivityName属性,Key也可以使用@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; }

}

我懂了。感谢您更新我。标记为答案。
bugnuker 2011年

1
无论如何要添加不是真正关键的唯一约束/索引?
Shimmy Weitzhandler,2012年

105

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

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

这确实有效,但是我希望有一个有效的注释。有带有CTP 4的示例,但这些示例在4.1 RC中不再起作用
bugnuker,2011年

3
我知道您在寻找注解,但认为这可能对搜索有所帮助...就像我说过的那样,我们没有使用注解,因此我在这里没有太大帮助...希望您找到答案
taylonr 2011年

14
我喜欢这种方法。使模型保持上下文关注。谢谢。
ctorx 2012年

有人知道使用流畅的api设置复合主键是否适用于SQL CE吗?它对我不起作用(给出“ EntityType ...没有定义键”的错误),我不确定是否要创建一个新问题。
kasitan

如果出于单元测试目的模拟DbContext,如何确保执行modelBuilder以定义实体和/或组合主键之间的关系?
Jim Aho 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.