Я пишу 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, мне интересно, есть ли другой способ использования текста данных.