我无法使用context.Database.ExecuteSqlCommand()
通过DbContext发送SQL语句。
我正在尝试执行
CREATE TABLE Phones([Id] [uniqueidentifier] NOT NULL PRIMARY KEY,
[Number] [int],[PhoneTypeId] [int])
GO
ALTER TABLE [dbo].[Phones] ADD CONSTRAINT [DF_Phones_Id]
DEFAULT (newid()) FOR [Id]
GO
失败并显示错误字符串
Incorrect syntax near the keyword 'ALTER'.
Incorrect syntax near 'GO'.
然而,在SSMS中运行该确切语句运行时没有错误?我需要通过DbContext解决有关默认约束的任何问题。我看到人们使用约束而没有将IsDbGenerated设置为true的问题。我不知道这会如何适用于此。
答案 0 :(得分:33)
GO不是SQL的一部分,因此无法使用ExecuteSqlCommand()执行。将GO视为在使用Management Studio或命令行工具时分离批次的一种方法。相反,只需删除GO语句,你应该没事。如果由于需要在不同的批次中运行命令而遇到错误,只需为要运行的每个批次调用一次ExecuteSqlCommand()。
答案 1 :(得分:4)
此处的替代实现是使用SMO而不是实体框架。我认为有一种叫做ExecuteNonQuery的有用方法会让你的生活变得更简单。 Here是一个很好的实现示例。
答案 2 :(得分:1)
我知道,necroposting是不好的方法,但这篇文章可能会节省一些人的时间。正如在Dave的帖子中提到的那样,GO不是SQL的一部分,因此我们可以创建一些小的解决方法来使其工作
var text = System.IO.File.ReadAllText("initialization.sql");
var parts = text.Split(new string[] { "GO" }, System.StringSplitOptions.None);
foreach (var part in parts) { context.Database.ExecuteSqlCommand(part); }
context.SaveChanges();
在这种情况下,您的命令将被分割并执行而不会出现问题