Сохранение нескольких объектов с одним и тем же свойством объекта EF core - PullRequest
0 голосов
/ 12 марта 2020

У меня такая ситуация: у меня есть объект MasterPlanComponent, который содержит несколько целей. Эти цели содержат несколько целей.

При создании masterPlanComponent (с 2 целями) мы создаем 4 цели для обеих этих целей.

Вот как это должно выглядеть:

  • 1 компонент> 2 цели> 8 целей (4 для одной, 4 для другой, цели являются пустыми и их просто необходимо создать в базе данных)

Проблема с нижеуказанным Код состоит в том, что создается только один набор из 4 целей, и только для второй цели.

public async Task<MasterPlanComponent> CreateMasterPlanComponent(int masterPlanId, CreateMasterPlanComponentCommand command) 
{

    var masterPlan  = await _context.MasterPlans
        .Include(mp => mp.Components)
        .Include(mp => mp.Objectives)
        .SingleOrDefaultAsync(m => m.MasterPlanId == masterPlanId);

        var targets = new  List<ObjectiveNetTarget>();
    //creating new targets and setting two of their fields
    for (int i = 0 ; i < 4 ;  i++)
    {
        targets.Add(new ObjectiveNetTarget
        {
            CustomerMarketSegment = command.Scope.CustomerMarketSegment,
            OrganizationUnit = new OrganizationUnitRef
            {
                Name = "Sales",
                Code = "1251"

            }
        });

    }
    var masterPlanComponent = Mapper.Map<CreateMasterPlanComponentCommand, MasterPlanComponent>(command);
    foreach (var objective in masterPlanComponent.Objectives)
    {
        objective.TargetValues = new List<ObjectiveNetTarget>(targets);
    }

    masterPlanComponent.Status = MasterPlanComponentStatuses.New;
    masterPlan.Components.Add(masterPlanComponent);
    masterPlan.Objectives = masterPlan.Objectives.Concat(masterPlanComponent.Objectives).ToList();
    //masterPlanComponent.Objectives targets, I can see that both of them have 4 net targets as it should be
    await _context.SaveChangesAsync();

    _logger.LogInformation("New master plan component created.");
    _logger.LogInformation("Master plan component id: " + masterPlanComponent.ComponentId.ToString());
    //after I try to save the context however, only one of them has it. 
    return masterPlanComponent;
}

этот код приводит к тому, что в базу данных записывается только 4 цели, каждая из которых указывает только на одну (последнюю) цель

1 Ответ

1 голос
/ 12 марта 2020

Похоже, это вызвано тем, что вы создаете цели заранее, а затем передаете их каждой цели. Когда вы передаете цели, которые вы создали, первой цели, EF начинает отслеживать их и помечает как подлежащие вставке. Когда вы передаете те же объекты csharp по ссылке на 2-ю цель, они уже помечаются как вставляемые и просто обновляются, чтобы ссылаться на 2-ю цель, а не на первую.

Попробуйте создать новые целевые объекты в csharp для каждой цели. EF вставит только 1 строку: 1 ссылка на объект csharp.

...