22 февр. 2009 г.

Обработка удаления в наследнике DataContext

Проблема: Через LINQ не удаляется объект

При просмотре запросов через DataContext.Log выясняется, что в базе даже запросы на удаление не уходят.

Пример

var db = new DBDataContext();
db.Log = Console.Out;
var q = from obj in db.PublicObjects
        where obj.ObjectID == new Guid("56547e27-be08-4440-962e-8e20bc1fb1ba")
        select obj;

var o = q.Single();
db.PublicObjects.DeleteOnSubmit(o);
db.SubmitChanges();
Запрос нормально отрабатывается, но объект не удаляется и так раз за разом.

Причина

В DataContext для моей БД был определен partial метод DeletePublicObject, при этом базовый объект перестает отрабатывать свою схему удаления
partial class DBDataContext
{
  partial void DeletePublicObject(PublicObject instance)
  {
    instance.OnDetele();
  }
}

Решение

Нужно или самому выполнить MS-SQL комманду для удаления через ExecuteCommand или вызвать метод, который отрабатывает удаление по умолчанию - ExecuteDynamicDelete. Я выборал второй путь, вот что получилось.
partial class DBDataContext
{
  partial void DeletePublicObject(PublicObject instance)
  {
    instance.OnDetele();
    ExecuteDynamicDelete(instance);
  }
}
Вставка и обновление записей обрабатываются аналогично, для них соответственно методы по умолчанию это ExecuteDynamicInsert и ExecuteDynamicUpdate.

Комментариев нет:

Отправить комментарий