Ядро Entity Framework - Как обрабатывать сопоставление и сохранение связанных сущностей

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

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 дочерних элемента с именем: (яблоко, груша), теперь я хочу обновить его через веб-API, чтобы он содержал 3 дочерних элемента (яблоко, апельсин, банан). обратите внимание: существующая дочерняя груша удаляется и добавляется 2 новых дочерних элемента (апельсин, банан). Предположим, что апельсин уже существует в дочерней таблице, а банан - нет, это следует учитывать. как новую запись в дочернюю таблицу, и я могу получить свою обновленную модель с именем ребенка в строковом массиве ([«яблоко», «апельсин», «банан»]) из веб-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 Core? Я действительно с нетерпением жду еще нескольких руководств в реальном приложении с Entity Framework ...


person KevDing    schedule 07.06.2018    source источник
comment
лучше напишите так. Вы добавляете родительский столбец в дочернюю таблицу как внешний ключ, и вы передаете имя родителя и обновляете всех дочерних элементов с условием where (присоединение к родительскому идентификатору с родительской таблицей) из дочерней таблицы в родительский набор null   -  person vivek nuna    schedule 07.06.2018
comment
Спасибо! Я добавил столбец parentId внешнего ключа в дочернюю таблицу, но что именно мне делать дальше?   -  person KevDing    schedule 07.06.2018
comment
Вы должны установить родительский ноль или удалить запись из дочерней таблицы   -  person vivek nuna    schedule 07.06.2018
comment
Чтобы сделать это, я думаю, я бы сделал следующие шаги: 1) из моего существующего родительского объекта сопоставьте массив имен дочерних элементов (поскольку существующий родительский объект будет содержать список дочерних объектов, а не только имя) 2) Используйте сопоставленный массив для сравнения с моей моделью представления массив дочерних имен VMUpdateParent, чтобы выяснить, что груша - это тот, который нужно удалить, а оранжевый, банан - это те, которые нужно добавить 3) выберите один дочерний объект по имени equlas pear из дочерней таблицы, установите parentId FK как null 4) выберите каждую дочернюю сущность по имени апельсин / банан из дочерней таблицы, установите parentId FK, правильно?   -  person KevDing    schedule 07.06.2018
comment
Такое ощущение, что процесс сложный, есть ли какой-нибудь эффективный способ сделать это?   -  person KevDing    schedule 07.06.2018
comment
Что такое Teams, что это, предположительно, родители?   -  person johnny 5    schedule 07.06.2018
comment
@ Джонни, извини, что это опечатка, должно быть _context.Parent.Update   -  person KevDing    schedule 07.06.2018


Ответы (1)


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

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

person KevDing    schedule 10.06.2018