【问题标题】:How do I set a custom reference column name in EF6 code-first?如何在 EF6 代码优先中设置自定义引用列名称?
【发布时间】:2017-02-23 06:08:45
【问题描述】:

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

[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) 时,我将引用 users.idmessages.author 作为外键包含在内。我喜欢这样:整洁和解释性。

然而,当我尝试使用代码优先方式时,我发现它将外键列命名为 messages.User_Id 而不是 messages.author,尽管我已经明确指定了 [Column("author")] 属性。

如何才能纠正这种行为?

我同意将其简单命名为 .user(而不是我原来的 .author 想法),以便在必要时使参考更加明显,但肯定不是 .User_Id - 当这种明显、多余和丑陋的时候,我完全不喜欢它_Id 被附加到键列。

我使用带有 SQLiteCodeFirst 库的 SQLite 数据库,但不确定这是正常的实体框架行为还是只是这个特定库中的错误。

【问题讨论】:

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


    【解决方案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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多