我有动态数据网站,它使用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。
答案 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()方法并以理想方式删除该条目?