Обновления связей в методах CRUD на ASP .NET с использованием СУБД PostgreSQL
возник вопрос нужно ли целенаправленно обновлять связи в методах CRUD в проекте на ASP .NET с использованием СУБД PostgreSQL?
Приведу пример у меня есть сущность "Цех" и "Оборудование" со связью 1 к М. При создании оборудования мне нужно явно указать цеху обновить список оборудования? Или EF Core или PostgreSQL сами сделает это за меня?
Сущность Workshop:
public int Id { get; set; }
public string Name { get; set; }
public virtual List<Machine>? Machines { get; set; }
Сущность Machine:
public int Id { get; set; }
public int WorkshopId { get; set; }
public string Name { get; set; }
public virtual Workshop Workshop{ get; set; }
Метод в контроллере при создание оборудования:
public async Task Create(Machine machine)
{
if (ModelState.IsValid)
{
await _machineRepository.Create(machine);
//Нужно ли обновлять связь тут??
var entityWS = await _workshopRepository.GetById(machine.WorkshopId);
if (entityWS != null && entityWS.Machines != null)
{
entityWS.Machines.Add(machine);
await _workshopRepository.Update(entityWS);
}
var WS = await _workshopRepository.GetById(machine.WorkshopId);
return RedirectToAction(nameof(Index));
}
return View(machine);
}
Ответы (1 шт):
Если вы в своих репозиториях _machineRepository
и _workshopRepository
работаете с БД рекомендованным способом - каждый раз создаёте новый DbContext
(и он у вас в DI
фреймворке не задан синглтоном):
using(DbContext context = new SomeDbContext())
{
// Do work with context
}
То вы и так должны получить правильный список Machines
когда будете запрашивать Workshop
. Ведь это не "настоящий" список, в базе он не хранится, он создаётся EF
на основании значений Machine.WorkshopId
совпадающих с Workshop.Id
. А значение WorkshopId
вы, я надеюсь, заполняете, когда создаёте экземпляр Machine
.
Если же вы храните и используете один DbContext
, то лучше откажитесь от этой практики как можно быстрее. Контекст всё сохраняет в кэше, очень быстро разбухает, не видит обновления базы, сделанные другими процессами, вы от этого ничего не выиграете, но получите случаи неправильного обновления данных, с которыми будет очень непросто разобраться.