Automapper, Entity Framework Core и несколько вложенных коллекций - PullRequest
0 голосов
/ 24 февраля 2019

В моей базе данных есть две таблицы - RuleGroups и Rules.Мои классы Entity Framework следующие:

public class RuleGroup
{
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<Rule> Rules { get; set; }
}

public class Rule
{
    [Key]
    public Guid Id { get; set; }
    public Guid RuleGroupId { get; set; }
    public string Name { get; set; }
    public ICollection<Condition> Conditions { get; set; }

    [ForeignKey("RuleGroupId")]
    public virtual RuleGroup RuleGroup { get; set; }
}

[NotMapped]
public class Condition
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

Условие класса не сопоставлено, поскольку оно сериализуется и сохраняется как JSON в таблице правил (с использованием этот пример)

Мои DTOS следующие:

public class UpdateRuleGroupDto
{
    public string Name { get; set; }
    public ICollection<UpdateRuleDto> Rules { get; set; }
}

public class UpdateRuleDto
{
    public string Name { get; set; }
    public ICollection<UpdateConditionDto> Conditions { get; set; }
}

public class UpdateConditionDto
{
    public string Name { get; set; }
}

В моем файле Startup.cs я инициализирую Automapper:

AutoMapper.Mapper.Initialize(cfg =>
{
    cfg.CreateMap<UpdateRuleGroupDto, RuleGroup>();
    cfg.CreateMap<UpdateRuleDto, Rule>();
    cfg.CreateMap<UpdateConditionDto, Condition>();
}

У меня есть конечная точка контроллера API, которая принимает документ JSON PATCH для внесения изменений в данныехранится в базе данных.

public IActionResult Patch(Guid ruleGroupId, [FromBody]JsonPatchDocument<UpdateRuleGroupDto> body)
{
    RuleGroup ruleGroupFromRepo = _deviceRules.GetRuleGroup(ruleGroupId);
    UpdateRuleGroupDto ruleGroupToPatch = Mapper.Map<UpdateRuleGroupDto>(ruleGroupFromRepo); 

    // Patching logic here

    Mapper.Map(ruleGroupToPatch, ruleGroupFromRepo);
    context.SaveChanges();

    return NoContent();
}

Проблема:

Когда изменения сделаны / сохранены, правила в таблице правил меняют / получают новый GUID.

Например, скажем, у нас есть эти данные в 2 таблицах.

  RuleGroup Table
  [Id][Name]
  [ddad5cac-e5a1-4db7-8167-66a6de3b8a0c][Test]

  Rule Table
  [Id][RuleGroupId][Name][Condition]
  [17c38ee8-4158-4ecc-b893-97786fa76e13][ddad5cac-e5a1-4db7-8167-66a6de3b8a0c][Test][[{"Name":"Test"}]]

Если я изменю поле [Имя] на новое значение, таблица правил будет выглядеть следующим образом.

  Rule Table
  [Id][RuleGroupId][Name][Condition]
  [ba106de8-bcbc-4170-ba56-80fe619cd757][ddad5cac-e5a1-4db7-8167-66a6de3b8a0c][Test2][[{"Name":"Test"}]]

Обратите внимание, что поле [Id] теперь имеет новый GUID.

EDIT

@ Герт Арнольд дал мне понять, что я не присоединяю сущности.Я запустил следующий код:

  foreach (var item in ruleGroupFromRepo.rules)
  {
    var x = _context.Entry(item).State;
  }

и все состояния были Добавлены и не изменены.Теперь я просто должен понять, как это сделать правильно.

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