Внимание ответ! =)
Локализовать причину помогло логирование запросов к базе.
Так как я использую NLog, то это делается так:
// Добавляем объект логгера в контроллер
private static Logger logger = LogManager.GetCurrentClassLogger();
// в самом методе, чтобы отслеживать запросы из него, добавляем:
db.Database.Log = (a) => logger.Info(a);
Всё, запросы пишутся в файл описанный в настройках NLog
Основная проблема решилась изменением кода контроллера с
if (ModelState.IsValid)
{
var parentTags = db.Tags.Where(a => ParentTags.Contains(a.Id)).ToList<Tag>();
tag.ParentTags = parentTags;
db.Entry(tag).State = EntityState.Modified;
db.SaveChanges();
}
на
if (ModelState.IsValid)
{
var parentTags = db.Tags.Where(a => ParentTags.Contains(a.Id)).ToList<Tag>();
db.Entry(tag).State = EntityState.Modified;
// перенесли добавление под предыдущую строку и добавляем так, а не приравниванием.
parentTags.ForEach(a => tag.ParentTags.Add(a));
db.SaveChanges();
}