我正在使用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/

10-09 08:18
查看更多