考虑一个简单的微博平台,其数据模型定义如下:
[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
被附加到关键列。
我使用带有SQLiteCodeFirst库的SQLite数据库,我不确定这是正常的Entity Framework行为还是只是这个特定库中的错误。
答案 0 :(得分: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; }
}