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