0

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

[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

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

4

1 回答 1

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; }
}
于 2017-03-01T15:45:55.267 回答