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