.net 如何首先在EF6代码中设置自定义引用列名?

.net 如何首先在EF6代码中设置自定义引用列名?,.net,sqlite,ef-code-first,entity-framework-6,ef-code-first-mapping,.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 N

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

[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; }
}
[表(“用户”)]
公共类用户
{
[列(“id”),键,DatabaseGenerated(DatabaseGenerateOption.Identity)]
公共长Id{get;set;}
[列(“名称”),最大长度(45),索引(IsUnique=true)]
公共字符串名称{get;set;}
[列(“密码”),最大长度(45)]
公共字符串密码{get;set;}
公共虚拟ICollection消息{get;set;}
}
[表(“信息”)]
公共类消息
{
[列(“id”),键,DatabaseGenerated(DatabaseGenerateOption.Identity)]
公共长Id{get;set;}
[列(“文本”),最大长度(512)]
公共字符串文本{get;set;}
[专栏(“作者”)]
公共虚拟用户作者{get;set;}
}
当我以第一种方式设计数据库(SQL DDL)时,我将
messages.author
引用
users.id
作为外键。我喜欢这样:整洁和解释

然而,当我第一次尝试代码时,我发现它命名了外键列
messages.User\u Id
而不是
messages.author
,尽管我明确指定了
[列(“作者”)]
属性

如何才能纠正这种行为

我同意将其命名为
.user
(而不是我原来的
.author
想法),以便在必要时使引用更加明显,但肯定不是
。user\u Id
-我完全不喜欢将这个明显、冗余和丑陋的
\u Id
附加到关键列中


我在库中使用SQLite数据库,不确定这是正常的实体框架行为还是这个特定库中的一个bug。

仅作为前言,当我使用LocalDb测试代码时,我得到了类似的行为,但生成的键是
Author\u ID
而不是
User\u ID
。我假设您的描述还没有更新以反映您在尝试时的代码更改

问题是您没有在
消息
类中定义属性来保存对
用户
的引用,因此它自己生成一个属性(
作者ID
)。如果您自己添加一个,并将列注释移动到其中,则数据库将使用您期望的名称

因此,您的
消息
类现在将是:

[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; }
}