0

Рассмотрим простой платформы микроблогов с моделью данных определяется следующим образом:Как установить имя столбца пользовательского ссылочного столбца в EF6 с кодовым кодом?

[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 и не уверен, является ли это нормальным поведением Entity Framework или просто ошибкой в ​​этой конкретной библиотеке.

ответ

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