2010-03-30 1 views
1

У меня есть объект 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 лучшим выбором для этого сценария? Или я столкнулся бы с той же проблемой?

+0

Не могли бы вы поделиться немецким текстом? –

+0

Несомненно! Сообщение об исключении: «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

+0

Это происходит всегда, или просто когда вы используете. –

ответ

0

Это, безусловно, работать в Entity Framework, которая поставляется с .NET 4 (я делаю подобные вещи в версии RC)

Это не объясняет исключение но:

Вы должны распоряжаться ObjectContext, который (скорее всего) завернут в ваш репозиторий. Контекст кэширует элементы и должен использоваться только для отдельной единицы работы.

Попробуйте использовать шаблон:

public ActionResult Update(int id, MyObject obj) // obj now has 4 child entities 
{ 
    using(var repository = CreateRepository()) 
    { 
     var obj2 = _repository.GetObj(id); 
     if(TryUpdateModel(obj2)) 
     { 
      repository.SubmitChanges(); 
     } 
     else 
      ..... 
    } 

    return RedirectToAction("List"); 
} 

При получении элементов, создать новое хранилище, а также. Они дешевы для создания и утилизации и должны располагаться как можно быстрее.

+0

В настоящее время я создаю репозиторий в конструкторе контроллера, поэтому я ожидаю, что он будет жить только для одного запроса, или я ошибаюсь? Дольше ли работает контроллер? (Я только начинаю с MVC и LinqToSql) Я попробовал его с помощью инструкции using внутри действия, но, как ни странно, он продолжает добавлять новые записи для дочерних объектов. Я продолжу расследование. Спасибо, пока! – Simon

+0

Хорошая точка там, добавьте некоторые точки останова: где создается репозиторий, в '.Update' и в' .List'. Если конструктор не выполняется дважды, у вас есть возможная проблема. –

+0

Хорошо, я просто проверил это, и репозиторий создается для каждого запроса – Simon

 Смежные вопросы

  • Нет связанных вопросов^_^