动态数据网站的LINQ帮助

时间:2009-07-27 05:58:59

标签: sql linq dynamic web

我有动态数据网站,它使用SQL SP进行更新操作。我在这里遇到问题,我的删除功能也是更新(设置IsDeleted = 1)操作。我目前正在使用LINQ查询并调用datacontext.SubmitChanges()进行删除。问题是,当我调用SubmitChanges()时,更新LINQ查询(设置IsDeleted = 1)也调用更新SP,它仅用于更新操作。有没有选项可以直接向DB发送我的LINQ查询,而不是调用更新SP?

Employee ild = (from emp in _dataContext.Employee
                                     where emp.IN_ID == int.Parse(ID)
                                     select emp).FirstOrDefault();
ild.IsDeleted=1;
_dataContext.Submitchanges();

上面的代码总是调用配置为Update操作的UpdateSP。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您是否可以使用删除存储过程,它将像您的更新过程一样被调用。删除proc不需要实际执行DELETE FROM表查询,而是可以在基础表上执行更新,并根据需要设置IsDeleted标志:

CREATE PROCEDURE
  @Id int
AS
  UPDATE dbo.Employee 
  SET IsDeleted = 1 
  WHERE Id = @Id

然后,您可以像使用Update方法一样将此函数映射到LINQ to SQL中的删除行为。使用此选项,您的客户端代码将在表上执行简单的Remove,而不是处理IsDeleted标志:

_dataContext.Employee.Remove(ild);
_dataContext.SubmitChanges();

在你的模型中,我认为你不应该公开IsDeleted。这是一个数据库实现细节。使用软删除时,您应该抽象出物理表并通过视图或表值函数公开功能。

作为软删除选项的替代方法,您可以考虑包含模仿事务表的Tombstone表。在删除操作上,使用存储过程或触发器将记录从事务表移动到逻辑删除表。有了它,您可以从数据库中消除IsDeleted标志,并消除在所有访问(包括报告)上包含过滤的需要。

答案 1 :(得分:0)

我不是百分百肯定我在这里遵循这个想法。

通常删除您要说的记录:

_dataContext.Employee.remove(ild);
_dataContext.Submitchanges();

但似乎您只想更新记录以读取任何将IsDeleted = 1设置为已删除记录的Enployee。通过运行当前的代码,可以生成UPDATE语句,因此UpdateSP将触发。

您是否有理由不能使用.remove()方法并以理想方式删除该条目?