在LINQ中使用ExecuteCommand

时间:2013-04-23 12:42:04

标签: c# asp.net linq-to-sql

我想在我的DB上执行语句:

/*Disable Constraints & Triggers*/
exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
exec sp_MSforeachtable 'ALTER TABLE ? DISABLE TRIGGER ALL'

/*Perform delete operation on all table for cleanup*/
exec sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; DELETE ?'

/*Enable Constraints & Triggers again*/
exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
exec sp_MSforeachtable 'ALTER TABLE ? ENABLE TRIGGER ALL'

/*Reset Identity on tables with identity column*/
exec sp_MSforeachtable 'IF OBJECTPROPERTY(OBJECT_ID(''?''), ''TableHasIdentity'') = 1 BEGIN DBCC CHECKIDENT (''?'',RESEED,0) END'

我有我的LINQ datacontext:

   public static bool ClearDatabase()
      {
          GetContext().ExecuteCommand("");
      }

MSDN文档中不清楚的部分是......我应该将每个语句作为单独的命令运行还是要执行一个很长的字符串?

我是否还要保留执行声明?

此外,如果有人知道使用LINQ清除数据库的更好方法,请告诉我。

由于

1 个答案:

答案 0 :(得分:6)

Execute只是执行它;内部是完全不透明的(除{0}之外,用于表示参数 - 即{0}变为@_p0,其值由params数组提供)。因此,只要您的TSQL有效(并且不包括GO等),那么它应该可以正常工作。它当然不关心TSQL很长。但是:尝试一下。

但是,我个人认为从数据上下文中运行它是有风险的,因为数据上下文可能具有缓存状态,这可能真的让事情变得混乱。我个人直接从ADO.NET运行它(或通过像“dapper”这样的帮助程序)。但是我认为如果你在执行此操作后立即丢弃(并且可能重新创建)数据上下文,它将会正常工作。