Принудительно наследовать классы в ASP.NET Core Entity Framework Core для выделенной таблицы MySQL - PullRequest
0 голосов
/ 01 октября 2018

Имея модель Thread, которая должна создавать все атрибуты другой модели с именем Post Я использую наследование:

class Post {
    public int Id{get;set;}
    public string Title{get;set;}
    // ...
}
class Thread: Post {
    public int ForumId{get;set;}
    // ...
}

EF Core помещает оба в одну таблицу и добавляет столбец Discriminator.Он содержит имя класса, так что .NET Core может сериализовать его для правильного типа.

Моя цель:

  • Таблица Post со всеми атрибутами из Post модели
  • Таблица Thread со всеми атрибутами из моделей Threadи Post

Почему?

  1. Я предполагаю, что обе таблицы будут расти в будущем
  2. Это взорвет мою базу данных, так какопределение таблицы содержит строки из Thread, которые всегда пусты в Post строках
  3. С точки зрения разработчика, он просто не выглядит чистым и вправо

То, что я уже попробовал

  • Создание двух разных DbSet<T> в моих DbContext для Post и Thread
  • Добавление builder.Entity<Post>().ToTable("Post") в OnModelCreating длякаждая сущность
  • Использование [Table("Post")] декоратора для определения класса
  • Перемещение общих атрибутов в абстрактную последовательность и пусть Post и Thread наследуются от нее

Какой-то обходной путь

Последний работает:

class Content {
    // Shared Attributes like Title
}
class Post: Content {}
class Thread: Content {}

Но это вызывает проблемы при связывании сущностей.

1 Ответ

0 голосов
/ 01 октября 2018

То, что вы описываете, называется TPC или Table-Per-Concrete Type, реляционным шаблоном и в настоящее время не поддерживается в Entity Framework Core.Вы можете следить за проблемой здесь .

В данный момент для этой функции нет вехи, поэтому, если вам абсолютно необходимо использовать TPC, ваш единственный выбор - использовать EF6 или другой альтернативный ORM.который поддерживает эту реляционную стратегию вместо EF Core.

Лично я бы рекомендовал придерживаться EF Core и просто использовать реляционные стратегии TPH (Table-Per-Hierarchy) или TPT (Table-Per-Type).Первый фактически является значением по умолчанию и приведет к одной таблице для обоих, с колонкой Discriminator, указывающей фактический тип.Последнее - то, что вы получаете, когда используете ToTable fluent config или атрибут [Table], и в результате получается таблица для базового типа, содержащая все общие свойства, а затем таблица для каждого производного типа, содержащая только свойства.для этого типа с внешним ключом обратно в таблицу базового типа.Существует тесная связь между чем-то вроде поста и цепочки, и есть смысл в том, чтобы поддерживать эти отношения на уровне базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...