Подтвердить что ты не робот

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. Я не уверен, как это применимо здесь.

4b9b3361

Ответ 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();

В этом случае ваши команды будут разбиты и выполнены без проблем