У меня есть объект Linq to Sql Entity, который имеет EntitySet. В моем представлении я показываю Entity с его свойствами плюс редактируемый список для дочерних элементов. Пользователь может динамически добавлять и удалять эти дочерние объекты. DefaultModelBinder отлично работает до сих пор, он правильно привязывает дочерние элементы.ASP.NET MVC 2: Обновление объекта Linq-To-Sql с EntitySet
Теперь моя проблема в том, что я просто не могу получить Linq To Sql, чтобы удалить удаленные дочерние сущности, он с радостью добавит новые, но не удалит удаленные. Я включил каскадное удаление во внешнем ключе, а конструктор Linq To Sql добавил атрибут «DeleteOnNull = true» к отношениям внешних ключей. Если я вручную удалю дочерний объект следующим образом:
myObject.Childs.Remove(child);
context.SubmitChanges();
Это удалит дочернюю запись из БД. Но я не могу заставить его работать для объекта, привязанного к модели. Я попытался следующие:
// this does nothing
public ActionResult Update(int id, MyObject obj) // obj now has 4 child entities
{
var obj2 = _repository.GetObj(id); // obj2 has 6 child entities
if(TryUpdateModel(obj2)) //it sucessfully updates obj2 and its childs
{
_repository.SubmitChanges(); // nothing happens, records stay in DB
}
else
.....
return RedirectToAction("List");
}
и это бросает InvalidOperationException, у меня есть немецкий ОС, так что я не совсем уверен, что сообщение об ошибке на английском языке, но он говорит что-то вдоль линий, что потребности сущностей версии (Timestamp row?) или политики проверки обновлений. Я установил UpdateCheck = «Никогда» для каждого столбца, кроме столбца первичного ключа.
public ActionResult Update(MyObject obj)
{
_repository.MyObjectTable.Attach(obj, true);
_repository.SubmitChanges(); // never gets here, exception at attach
}
Я много читал о подобных «проблем» с Linq To Sql, но мне кажется, большинство из этих «проблем», на самом деле дизайн. Так ли я прав в своем предположении, что это не работает, как я ожидаю, что он сработает? Нужно ли мне вручную перебирать дочерние объекты и удалять, обновлять и вставлять их вручную? Для такого простого объекта это может работать, но я планирую создавать более сложные объекты с вложенными EntitySets и так далее. Это всего лишь тест, чтобы увидеть, что работает, а что нет. До сих пор я разочарован Linq To Sql (возможно, я просто не понимаю). Будет ли платформа Entity Framework или NHibernate лучшим выбором для этого сценария? Или я столкнулся бы с той же проблемой?
Не могли бы вы поделиться немецким текстом? –
Несомненно! Сообщение об исключении: «Eine Entität kann nur als geändert und ohne den ursprünglichen Zustand angefügt werden, wenn sie ein Versionselement deklariert oder über keine Richtlinie für die Überprüfung auf Обновления verfügt." – Simon
Это происходит всегда, или просто когда вы используете. –