Двойная структура «многие ко многим» Entity Framework - PullRequest
0 голосов
/ 21 мая 2019

Я хочу реализовать чат в своем приложении, схема базы данных, которую я создал:

enter image description here

Когда я сначала сгенерировал модель с помощью базы данных Entity Framework, я получил следующее:

enter image description here

Я не хочу, чтобы пользователь, пользователь1, вместо этого я хочу оставить From и To, когда я изменяю их непосредственно в модели, я получаю сообщение об ошибке, потому что база данных и модель не совпадают - как я могу обработать это?

1 Ответ

0 голосов
/ 21 мая 2019

Если вам не нравятся имена таблиц и столбцов по умолчанию, которые Entity Framework выбирает для вас, вы можете сообщить Entity Framework, какими они должны быть.

Для этого вы можете использовать атрибуты.ИМХО, это делает ваш код ужасным.Кроме того, вы не можете использовать свои классы в другой базе данных с разными именами для таблиц и столбцов.

Поэтому я предпочитаю использовать свободный API в DbContext.OnModelCreating

Давайте сначала определим классы User и Message

class User
{
    public int Id {get; set;}
    ... // other properties

    // every User has zero or more "From" messages (one-to-many)
    public virtual ICollection<Message> FromMessages {get; set;}

    // every user has zero or more "To" message (one-to-many)
    public virtual ICollection<Message> ToMessages {get; set;}
}

class Message
{
    public int Id {get; set;}
    ... // other properties

    // every Message has exactly one "From" user using foreign key FromUserId
    public int FromUserId {get; set;}
    public virtual User From {get; set;}

    // every Message has exactly one "To" user using foreign key ToUserId
    public int ToUserId {get; set;}
    public virtual User To {get; set;}
}

В Entity Framework столбцы вашей таблицы представлены не виртуальными свойствами;виртуальные свойства представляют отношения между таблицами.

Следовательно, внешние ключи не являются виртуальными, а элементы, на которые указывают внешние ключи, являются виртуальными.

Время использовать свободный API:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    var messageEntity = modelBuilder.Entity<Message>();
    // every messages belongs to exactly one User using foreign key `FromUserId`
    // every such User has zero or more From messages
    messageEntity.HasRequired(message => message.From)
                 .WithMany(user => user.FromMessages)
                 .HasForeignKey(message => message.FromUserId)
    // the same for To, using ToUserId:
    messageEntity.HasRequired(message => message.To)
                 .WithMany(user => user.ToMessages)
                 .HasForeignKey(message => message.ToUserId);
}

Вы также можете сделать это наоборот, начиная с Users:

var userEntity = modelBuilder.Entity<User>();

// every user has zero or more FromMessages (one-to-many)
userEntity.HasMany(user => user.FromMessages)
          .WithRequired(message => message.From)
          .HasForeignKey(message => message.FromUserId);
// every user has zero or more ToMessages (one-to-many)
userEntity.HasMany(user => user.ToMessages)
          .WithRequired(message => message.To)
          .HasForeignKey(message => message.ToUserId);
...