使用包含外键关系的多列(复合)主键

时间:2012-03-01 21:50:54

标签: foreign-key-relationship composite-primary-key entity-framework-4.3

我正在使用Entity Framework 4.3,设计简单:

public class Post
{
    [Key]
    public int ID { get; set; }

    public string Text { get; set; }

    public HashSet<PostTag> Tags { get; set; }
}

public class PostTag
{
    public Post Post { get; set; }

    [Key, Column(Order=0)]
    [ForeignKey("Post")]
    public int PostID { get; set; }

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

因此,您可以看到Post有多个标签,这些标签使用PostID和Tag的复合主键。

当我运行update-database时,我得到:

Cannot define PRIMARY KEY constraint on nullable column in table 'PostTag'.

我尝试将[必需]属性应用于Post和PostID。我已经尝试将ForeignKey属性放在FK关系的另一侧。我已经尝试将InverseProperty属性应用于Post(它将错误更改为模糊的NullReferenceException - 这似乎是一个错误)。

1 个答案:

答案 0 :(得分:0)

事实证明,如果我将InverseProperty放在HashSet上,EF可以迁移数据库,但前提是它是干净的:

public class Post
{
    ...
    [InverseProperty("Post")]
    public HashSet<PostTag> Tags { get; set; }
}

如果我从看起来像这样的PostTag类迁移:

public class PostTag
{
    public Post Post { get; set; }

    [Key]
    [ForeignKey("Post")]
    public int PostID { get; set; }

    [Key]
    [MaxLength(50)]
    public string Tag { get; set; }
}

我得到例外:

'FK_PostTag_Post_Post_ID'不是约束。 无法删除约束。查看以前的错误。

看起来它可能是EF Code First的一个错误,它允许将复合键应用于这些属性,但实际上并未将其应用于数据库(由上述代码生成的表具有单列PK在Tag)。