0

考慮一個簡單的微博平臺被定義爲數據模型如下:如何在EF6代碼優先中設置自定義引用列名稱?

[Table("users")] 
public class User 
{ 
    [Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    [Column("name"), MaxLength(45), Index(IsUnique = true)] 
    public string Name { get; set; } 

    [Column("password"), MaxLength(45)] 
    public string Password { get; set; } 

    public virtual ICollection<Message> Messages { get; set; } 
} 


[Table("messages")] 
public class Message 
{ 
    [Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    [Column("text"), MaxLength(512)] 
    public string Text { get; set; } 

    [Column("author")] 
    public virtual User Author { get; set; } 
} 

當我在設計它的數據庫(SQL DDL)第一種方式,我已經包括了messages.author引用users.id作爲外鍵。我喜歡這樣:整潔和解釋性。

但是,當我嘗試使用代碼優先的方式時,我發現它命名外鍵列messages.User_Id而不是messages.author,儘管我明確指定了[Column("author")]屬性。

這種行爲如何得到糾正?

我會同意它命名只是.user(而不是我原來的.author想法),使基準必要時更爲明顯,但肯定不是.User_Id - 我完全不喜歡它,當這種明顯的,多餘的,醜陋的_Id被追加到關鍵列。

我使用SQLite數據庫與SQLiteCodeFirst庫,我不確定這是否是正常的實體框架行爲或只是在這個特定的庫中的錯誤。

回答

1

就在前言中,當我使用LocalDb測試你的代碼時,我得到了類似的行爲,但生成的密鑰是Author_ID而不是User_ID。我假設你的描述只是沒有更新,以反映代碼的變化,而你正在嘗試的事情。

問題是您沒有在Message類中定義的屬性來保存對User的引用,所以它自己生成一個(Author_ID)。如果您自己添加一個並將列註釋移到該註釋中,那麼您的數據庫將使用您期望的名稱。

所以你Message類現在將是:

[Table("messages")] 
public class Message 
{ 
    [Column("id"), Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    [Column("text"), MaxLength(512)] 
    public string Text { get; set; } 

    [Column("author")] 
    public long AuthorId { get; set; } 

    public virtual User Author { get; set; } 
} 
相關問題