SqlException: Синтаксическая ошибка около 'GO'
У меня возникла проблема с отправкой SQL-запроса через DbContext с помощью context.Database.ExecuteSqlCommand()
.
Я пытаюсь выполнить
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. Я не уверен, как это применимо здесь.
Ответы
Ответ 1
GO не является частью SQL, поэтому он не может быть выполнен с помощью ExecuteSqlCommand(). Подумайте о GO как способе разделения партий при использовании Management Studio или инструментов командной строки. Вместо этого просто удалите инструкции GO, и все будет в порядке. Если вы столкнулись с ошибками, потому что вам нужно запускать свои команды отдельными партиями, просто вызовите ExecuteSqlCommand() один раз для каждой партии, которую вы хотите запустить.
Ответ 2
Дэйв Маркл избил меня. Фактически, вы можете изменить "GO" на любую другую строку для разделения партий.
Альтернативная реализация здесь заключается в использовании SMO вместо Entity Framework. Существует полезный метод, называемый ExecuteNonQuery, который, я думаю, сделает вашу жизнь намного проще. Здесь - хороший пример реализации.
Ответ 3
Я знаю, что некропостинг плохо работает, но может быть, этот пост спасет кого-то. Как упоминалось в сообщении 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();
В этом случае ваши команды будут разбиты и выполнены без проблем