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; } 
} 
相关问题