Entity Framework Core Inheritance создание дочерних таблиц - PullRequest
0 голосов
/ 06 декабря 2018
public class Product
{
    public string Name { get; set; }
    public int Qty { get; set; }
    public decimal Price { get; set; }``
}
public class CartItem : Product
{
    public int CartItemId { get; set; }

    public string CartId { get; set; }
}
public class OrderLine : Product
{
    public int OrderLineId { get; set; }

    public int OrderId { get; set; }
}

public class Kititem : Product
{
    public int KititemId { get; set; }

    public int OrderId { get; set; }
}

public class SampleContext : DbContext
{
    public DbSet<CartItem> CartItems { get; set; }
    public DbSet<OrderLine> OrderLines { get; set; }
    public DbSet<Kititem> Kititems { get; set; }
}

Как вы можете видеть в этом, я не включаю родительский класс Product в DbContext, и при выполнении миграций он создает таблицу для каждого производного класса со всеми свойствами, образующими родительский класс, и несоздать родительский класс, потому что он не включен в Dbcontext, для меня это было то, что я экспериментировал и работал, и я доволен этим до сих пор. Mi вопрос, является ли это плохой практикой, и, возможно, я не использую ядро ​​ef Inheritanceкак я могу воспользоваться всеми преимуществами?Я в замешательстве и хочу начать новый проект и сделать это наилучшим образом, поэтому мне не нужно повторять его снова

1 Ответ

0 голосов
/ 06 декабря 2018

То, что вы используете, называется «базовым классом», а не «базовым объектом», то есть классом, участвующим в наследовании модели базы данных.

Вы вообще не обязаны использовать наследование базы данных.Более того, EF Core в настоящее время поддерживает только стратегию Таблица на иерархию (TPH) , которая не является наилучшей, если у вас есть много производных сущностей со многими различными свойствами (поскольку все данные хранятся в одной таблице).

Другими словами, нет ничего плохого в том, чтобы не использовать наследование базы данных.Единственное преимущество наследования базы данных - это если вам нужны полиморфные запросы, то есть запросы, которые возвращают Product разных типов.Такие запросы можно выполнять без наследования базы данных, используя оператор Union / Concat LINQ, но они не будут эффективными из-за отсутствия в EF Core перевода таких запросов в SQL, поэтому они всегда используют клиент оценка .

Конечно, это будет улучшено в некоторых будущих версиях EF Core (а также поддержка других стратегий наследования), поэтому главный вопрос должен быть - нужны ли вам такие запросы.Если вы этого не сделаете, то ваш подход не использовать наследование базы данных просто отлично.Если вы это сделаете, то решите, что больше подходит для ваших нужд - руководство Concat или отдельная таблица с большим количеством столбцов.

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