Можно ли передать модели Entity Framework сценарий SQL для запуска с базой данных - PullRequest
7 голосов
/ 30 мая 2010

Можно ли передать сценарий SQL какому-либо методу, который Entity Framework должен запустить для моей модели? например эквивалент:

context.ExecuteStoreCommand(<tsql script path>); 

Справочная информация. Мне нужен способ сброса базы данных во время модульных тестов, и один из способов добиться этого - сделать вызов для запуска сценария TSQL, сгенерированного EF (из Generate Database from Model).

Ответы [ 5 ]

8 голосов
/ 04 июля 2011

У меня есть простой код, который запускает sql, как это:

if (!_context.CableSweepDebug.Any(rec => /* CHECK TO SEE IF SQL ALREADY RUN */ ))
{
    var sql = System.IO.File.ReadAllText("SqlScript.sql");
    _context.Database.ExecuteSqlCommand(sql);
}
2 голосов
/ 19 января 2016

Я нашел простой ПУТЬ:

  1. Получите ваш SQL-скрипт в строковую переменную:

    string result = "";
    using (Stream stream = assembly.GetManifestResourceStream(resourceName))
    {
        using (StreamReader reader = new StreamReader(stream))
        {
            result = reader.ReadToEnd();
        }
    }
    
  2. Затем разделите строку, используя GO в качестве разделителя:

    string[] commands = result.Split(new string[] { "GO" }, StringSplitOptions.RemoveEmptyEntries);
    
  3. Наконец, выполните каждую команду в том же порядке, используя соединение с базой данных из вашего контекста (содержит код https://stackoverflow.com/a/1579220):

    YourContext context = new YourContext(); //Instance new Context
    DbConnection conn = context.Database.Connection; // Get Database connection
    ConnectionState initialState = conn.State; // Get Initial connection state
    try
    {
        if (initialState != ConnectionState.Open)
            conn.Open();  // open connection if not already open
    
        using (DbCommand cmd = conn.CreateCommand())
        {
            // Iterate the string array and execute each one.
            foreach (string thisCommand in commands)
            {
                cmd.CommandText = thisCommand;
                cmd.ExecuteNonQuery();
            }
        }
    }
    finally
    {
        if (initialState != ConnectionState.Open)
            conn.Close(); // only close connection if not initially open
    }
    

Я так и сделал. Надеюсь, это поможет!

0 голосов
/ 19 апреля 2013

Хранить просто

using (var context = new MyDBEntities())
{
    var m = context.ExecuteStoreQuery<MyDataObject>("Select * from Person", string.Empty);
    //Do anything you want to do with 
    MessageBox.Show(m.Count().ToString());
}
0 голосов
/ 12 апреля 2011

Почему бы вам просто не сделать SqlConnection простым соединением ADO.NET для выполнения SQL против вашей базы данных в тестовой среде. Поскольку будет очень мало простых SQL-операторов, и вы не собираетесь развертывать или экспортировать свой тест где-либо за пределами вашей среды разработки. Я не думаю, что есть необходимость делать это через структуру сущностей.

0 голосов
/ 12 апреля 2011

Не могу поверить, что никто не ответил на это. Я пытаюсь понять это сейчас. Я думаю, один из способов сделать это - прочитать скрипт в строку, а затем выполнить команду store для этого. То, что я пытаюсь выяснить, каковы ограничения на это. Разрешены ли все операторы TSQL, кроме GO? Или вам лучше использовать sqlcmd.exe для запуска. Вот лучшее решение, которое я нашел - используйте SMO для запуска скрипта:

http://social.msdn.microsoft.com/Forums/en/sqlsmoanddmo/thread/44835d6f-6bca-4374-93e2-3a0d81280781

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...