Таблица EF с наследуемым, но не абстрактным?

#c# #entity-framework #entity-framework-core

#c# #entity-framework #сущность-фреймворк-ядро

Вопрос:

Я хочу создать три таблицы:

  1. Tasks — в этой таблице хранится информация в виде идентификаторов, имен, приоритета задач
  2. TakenTasks — в этой таблице мы храним идентификатор пользователя, который принимает задачи с датой и временем
  3. EndedTasks — Задача, которая заканчивается датой и временем окончания

Мой вопрос в том, как создать в EntityFramework Core таблице TakenTasks и EndedTasks сопоставить те же свойства с Tasks таблицей, не переписывая код для идентификаторов задач, названия задач и т. Д.?

Tasks таблица может быть построена на основе abstract Task класса, потому что я хочу иметь объект Task в списке. Каково наилучшее решение для scenerio, как я упоминал выше?

 public class Task 
{
    int Id { get; set; }
    string Name { get; set; }
    Priority Priority { get; set; }
}

public class TakenTask 
{
    string UserId { get; set; }
    DateTime DateOfTaken { get; set; }
}

public class EndedTask 
{
    DateTime DateOfEnd { get; set; }
}
  

Как хранить информацию из Task in TakenTask и EndedTask withotu, переписывая свойства из Task и иметь 3 таблицы?

Комментарии:

1. Не лучше ли было бы нормализовать таблицу 3 и просто использовать таблицу 1 с флагом, чтобы указать, что она занята или закончена

2. Но что лучше? Что обычно используется в реальной среде?

Ответ №1:

Вам не нужно дублировать столбцы в трех таблицах, используйте внешний ключ от TakenTasks и EndedTasks до Task , и вы можете создать a public virtual Task ParentTask{ get; set; } в обоих TakenTasks , EndedTasks чтобы получить доступ к свойствам задачи

Ответ №2:

Я думаю, вам нужно 2 таблицы:

  1. Task
  2. Assign

В Task должно быть

 int Id { get; set; }
string Name { get; set; }
Priority Priority { get; set; }
Status Status { get; set; }
  

В Assign должно быть

 int TaskId { get; set; }
int UserNameId { get; set; }
DateTime StartDate { get; set; }
DateTime EndDate { get; set; }`
  

Надеюсь, это поможет