【问题标题】:LINQ help for Dynamic Data Website动态数据网站的 LINQ 帮助
【发布时间】:2010-11-14 06:28:18
【问题描述】:

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

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

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

【问题讨论】:

标签: sql linq dynamic web


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 这也是我看待问题的方式。只需更新 isDeleted 列并继续。
【解决方案2】:

我不确定我是否 100% 遵循这里的想法。

一般要删除你会说的记录:

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

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

您是否有理由不能使用 .remove() 方法并从物理上删除条目?

【讨论】:

  • 不物理删除行是业务需求
  • 嗯好吧,在那种情况下我的回答是没用的。很抱歉!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
相关资源
最近更新 更多