【问题标题】:Use a Multi-Column (Composite) Primary Key that includes a Foreign Key Relationship使用包含外键关系的多列(复合)主键
【发布时间】:2012-03-01 21:50:53
【问题描述】:

我正在使用具有简单设计的 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; }
}

所以你可以看到一个帖子有多个标签,这些标签使用 PostID 和标签的复合主键。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    事实证明,如果我将 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标签上)。

    【讨论】:

    • 您可以解决 EF 4.3.1 中的错误(如果您刚刚使用 4.3,请先升级),方法是删除被忽略的关键属性,清除 __MigrationHistory 表,然后创建初始使用 Update-Database Initial -IgnoreChanges 进行迁移,以使其与实际离开的方式保持同步。实际上,您可以从那里按预期进行迁移。
    猜你喜欢
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多