Не уверен, что вы получите то, что ищете. В любом случае вам придется загрузить граф сущностей в Entity Framework, чтобы он мог отслеживать изменения.
Как написано в вашем примере, Attach (кстати, с ошибкой) добавит объект только в трекер изменений Entity Framework с состоянием по умолчанию «Без изменений».
Вам необходимо сообщить Entity Framework, что запись была изменена, чтобы EF мог обновить записи.
Если вы ЗНАЕТЕ , что предоставленная категория уже существует (что я и предполагаю, когда вы сказали "предполагая, что все пользовательские данные верны"), тогда вы можете использовать следующее:
foreach (var category in post.Categories)
{
// This will attach the entity and set the entity state to modified
// Note this will throw an exception if the underlying entity doesn't
// exist when the "SaveChanges" method is called.
context.Entry(category).State = EntityState.Modified;
}
Я предполагаю, что вы реализуете какие-то проверки и противовесы, чтобы гарантировать, что запись существует до вышеприведенного кода, но в случае, если вы не хотите проходить через проблему, вот фрагмент кода, который должен работать для вас. Блок «Еще» может быть добавлен для добавления категории, если она еще не существует.
foreach (var category in post.Categories)
{
var existingRecord = context.Categories.SingleOrDefault(x => x.ID == category.Id);
if (existingRecord != null)
{
context.Entry(existingRecord).CurrentValues.SetValues(category)
}
}