1

我使用实体框架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'. 

我已经试过应用[必需]属性POST和帖子ID。我试着将ForeignKey属性放在FK关系的另一边。我已经尝试应用Post的InverseProperty属性(它将错误更改为模糊的NullReferenceException - 这看起来像一个错误)。

回答

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标签)。

+0

通过删除被忽略的key属性,清除__MigrationHistory表,然后使用Update-Database创建初始​​迁移,您可以解决EF 4.3.1中的错误(如果您刚刚在4.3上,请先升级)初始-IgnoreChanges以最新的方式让它保持最新状态。事实上,你可以按照预期迁移。 – 2012-03-01 22:33:27