我正在使用Winforms编写CRUD,并通过Linq2Sql连接到MS SqlServer 2008。
当我的应用程序用户想要删除数据库中的记录时,我不希望其实际删除。我只想将一个名为“ DlDat”的列设置为当前日期时间,然后更新记录而不是删除它。为了在Linq中强制这种行为,我扩展了sqlmetal自动生成的Delete(table)方法。
如果例如我有一个名为“ 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)
这可能是因为当上下文的ChangeSet仅包含“删除”而没有“更新”时,我使用ExecuteDynamicUpdate。
我可以通过仅更新记录来解决此问题,而不是在用户使用存储过程按删除按钮或消息时将其删除。但是由于我是Linq的新手,所以我想知道是否有另一种使用数据上下文的方法。
最佳答案
这样做的问题是,linq假定您将使用要覆盖的相同CRUD操作。看一下这篇文章(Responsibilities of the Developer In Overriding Default Behavior (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();
}
关于c# - Linq2Sql:更改“删除”可扩展性方法以更新记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/915157/