如何在EF6代码优先设置自定义引用列名称?

时间:2017-02-23 06:08:45

标签: .net sqlite ef-code-first entity-framework-6 ef-code-first-mapping

考虑一个简单的微博平台,其数据模型定义如下:

[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行为还是只是这个特定库中的错误。

1 个答案:

答案 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; }
}