Entity Framework Core - как обрабатывать сопоставление и сохранение связанных объектов - PullRequest
0 голосов
/ 07 июня 2018

У меня есть два связанных объекта, которые являются отношениями один-ко-многим, как показано ниже:

class parent{
 public string parentName{get;set;}
 public virtual ICollection<child> childs { get; set; }
}

class child{
  public string childName{get;set;}
  public parent parent{get;set;}
  ["ForeignKey"]
  public int parentId {get; set;}
}
/// View Model
class VMParent{
  public string parentName{get;set;}
  /// a string array contains child name
  public string[] childlist { get; set; }
}

Предположим, что мой родитель в настоящее время содержит 2 детей с именем: ( яблоко, груша ),теперь я хочу обновить его через web api, чтобы он содержал 3 дочерних элемента ( яблоко, апельсин, банан ), обратите внимание, здесь удалена существующая дочерняя груша и 2 новых дочерних элемента (оранжевый, banana), здесь предположим, что апельсин уже существует в таблице child, но banana нет, его следует рассматривать как новую запись в дочерней таблице , и я могу получить свою обновленную модель с именем childs в массиве строк ( ["apple", "orange", "banana"] ) из тела web api Просмотр модели как:

[HttpPut("{id}")]
public async Task<IActionResult> Update(string name, [FromBody]VMParent VMUpdateParent)
{
    if (ModelState.IsValid)
    {
        var existingParent = await _context.Parents
                            .Include(t => t.childs)
                            .SingleOrDefaultAsync(p => p.parentName == name);

        existingParent.parentName = updateParent.parentName;

        var childsToBeUpdated = updateParent.childList; /// ["apple","orange","banana"]

        /// HOW TO HANDLE or REBUILD the relationship that can
        /// 1) remove child (pear) from existingParent
        /// 2) add child "banana" to Child table
        /// 3) add childs (orange and banana) to existingParent?
        ......

        _context.Parents.Update(existingParent);
        await _context.SaveChangesAsync();

        return new NoContentResult();
    }
    return BadRequest(ModelState);
} 

Есть ли оператор "MERGE", как в SQL в Entity Frameworkядро?Я действительно с нетерпением жду еще нескольких руководств в реальных приложениях с Entity Framework ...

1 Ответ

0 голосов
/ 10 июня 2018

Я сам нашел одно решение, используя AutoMapper между моделью представления VMUpdateParent с существующей моделью существующий родительский в , удалите ненужный дочерний узел и добавьтеновый дочерний узел.

Однако, если у кого-то есть какое-либо улучшенное или лучшее решение, пожалуйста, не стесняйтесь поделиться здесь.Заранее спасибо!

...