Добавление или обновление дочерних объектов при обновлении родительской сущности в Entity Framework Core - PullRequest
0 голосов
/ 22 декабря 2019

В новом проекте мы используем Entity Framework Core вместо EntityFramework 6.2.0. Работает хорошо, но вызывает проблему при обновлении родительских детей при добавлении новых детей.

Пример:

Текущая модель:

public class Profile
{

    public Profile()
    {
        Interests = new List<Interest>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public ICollection<Interest> Interests { get; set; }

}

public class Interest
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string Name { get; set; }

}

Код для добавления или обновления детейв Entity Framework, отлично работал в EntityFramework 6.2.0

//Interests
//Delete children
foreach (var existingChild in dbProfile.Interests.ToList())
{
    if (!profile.Interests.Any(c => c.Name == existingChild.Name))
        db.Interests.Remove(existingChild);
}

//Update and Insert children
foreach (var childModel in profile.Interests)
{
    var existingChild = dbProfile.Interests
        .Where(c => c.Name == childModel.Name)
        .SingleOrDefault();

    if (existingChild != null)
    {
        // Update child
        childModel.Id = existingChild.Id;
        db.Entry(existingChild).CurrentValues.SetValues(childModel);
    }
    else
    {
        // Insert child
        var newChild = new Interest
        {
            Name = childModel.Name,
        };
        dbProfile.Interests.Add(newChild);
    }
}

Код основан на этом ответе:

https://stackoverflow.com/a/27177623/3850405

При использовании Microsoft.EntityFrameworkCore 2.2.6 это происходит:

Новый интерес добавляется с Id 0, как и ожидалось.

enter image description here

Однако, если происходит обновление и запускается следующий код:

db.Entry(existingChild).CurrentValues.SetValues(childModel);

Каждый новый объект с Id 0 имеет Id, установленный на -2147482197. Это происходит, даже если для родительского объекта ничего не установлено, только один дочерний объект. Почему это происходит? Что-то заменило вышеуказанный метод в EF Core?

enter image description here

Я могу решить эту проблему, удалив db.Entry(existingChild).CurrentValues.SetValues(childModel); и заменив его на childModel.Name = existingChild.Name;. Но если объект имел 20 или более свойств, я не хотел бы вручную сопоставлять их одно за другим.

enter image description here

1 Ответ

1 голос
/ 22 декабря 2019

Обновлены следующие NuGets с 2.2.6 до 3.1.0, после чего все стало работать нормально:

Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
...