Linq2Sql: изменение метода расширяемости «delete» для обновления записи - PullRequest
2 голосов
/ 27 мая 2009

Я пишу CRUD, используя winforms, подключаясь к MS SqlServer 2008 через Linq2Sql.
Когда пользователь моего приложения хочет удалить запись в базе данных, я не хочу, чтобы она была физически удалена. Я просто хочу установить столбец с именем «DlDat» на текущее время и затем обновить запись, а не удалять ее. Чтобы заставить это поведение в Linq, я расширяю метод Delete (таблица), автоматически сгенерированный sqlmetal.
Например, если У меня есть таблица базы данных с именем «Unit» и текстовый текст с именем «PdpDataContext», код выглядит следующим образом:

public partial class PdpDataContext
{
    public PdpDataContext() : base()
    {
        OnCreated();
    }
    partial void DeleteUnit(Unit instance)
    {
        instance.DLDAT = DateTime.Now;
        this.ExecuteDynamicUpdate(instance);
    }
    partial void UpdateUnit(Unit instance)
    {
        instance.CHDAT = DateTime.Now;
        this.ExecuteDynamicUpdate(instance);
    }
}

Но когда я делаю удаление:

PdpDataContext cx = new PdpDataContext();
cx.ObjectTrackingEnabled = true;
Unit u = new Unit();
u = cx.Unit.Single(x => x.INTUNITNO == 1);
cx.Unit.DeleteOnSubmit(u);
cx.SubmitChanges();

Я получаю SqlException "неправильный синтаксис рядом с WHERE". Регистрируя вывод SQL контекста, я вижу, что Linq пытается выполнить «пустое» обновление:

UPDATE [dbo].[Unit]
SET 
WHERE ([INTUNITNO] = @p0) AND ([version] = @p1)

Это может быть связано с тем, что я использую ExecuteDynamicUpdate, когда набор изменений контекста содержит только «удаление» и отсутствие «обновления».
Я мог бы обойти это, просто обновив запись, а не удаляя ее, когда пользователь нажимает кнопку удаления или pherhaps с помощью хранимой процедуры. Но так как я новичок в мире Linq, мне интересно, есть ли другой способ использования текста данных.

Ответы [ 2 ]

1 голос
/ 06 августа 2009

Проблема с этим заключается в том, что linq предполагает, что вы собираетесь использовать ту же операцию CRUD, которую вы переопределяете. Взгляните на эту статью ( Обязанности разработчика по переопределению поведения по умолчанию (LINQ to SQL) )

Вот что я бы сделал:

partial void DeleteUnit(Unit instance)    
{        
   //instance.DLDAT = DateTime.Now;        
   //this.ExecuteDynamicUpdate(instance);

   PdpDataContext cx = new PdpDataContext();
   cx.ObjectTrackingEnabled = true;
   Unit u = new Unit();
   u = cx.Unit.Single(x => x.INTUNITNO == 1);
   u.DLDAT = DateTime.Now;
   cx.SubmitChanges();
}
1 голос
/ 27 мая 2009

Интересно, не лучше ли использовать триггер «INSTEAD OF» (удалить) на таблице ... или просто не лгать LINQ: если вы хотите сделать UPDATE (а не DELETE) затем обновите объект (не удаляйте его). Например, напишите метод в контексте данных, который имитирует удаление, вместо использования DeleteOnSubmit.

Вы также можете сделать что-то с переопределением SubmitChanges и исследованием дельт, но я не уверен, что это хорошая идея

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...