В новом проекте мы используем 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
, как и ожидалось.
Однако, если происходит обновление и запускается следующий код:
db.Entry(existingChild).CurrentValues.SetValues(childModel);
Каждый новый объект с Id 0
имеет Id
, установленный на -2147482197
. Это происходит, даже если для родительского объекта ничего не установлено, только один дочерний объект. Почему это происходит? Что-то заменило вышеуказанный метод в EF Core?
Я могу решить эту проблему, удалив db.Entry(existingChild).CurrentValues.SetValues(childModel);
и заменив его на childModel.Name = existingChild.Name;
. Но если объект имел 20 или более свойств, я не хотел бы вручную сопоставлять их одно за другим.