EF 4.1 Code Первая инициализация - альтернатива - PullRequest
3 голосов
/ 24 апреля 2011

Я создаю веб-приложение с использованием структуры сущностей и подхода, основанного на коде, и мне это до сих пор нравится, кроме одной вещи. Процесс инициализации и данные заполнения - это дерьмо.

Я настроил его в соответствии с рекомендациями ASP.NET MVC, при этом setinitialiser вызывается при запуске приложения и настраиваемый класс инициализации для добавления данных, но всегда кажется, что он работает тихо и никогда не работает. (Создание базы данных работает только при сбое инициализации данных)

Может ли кто-нибудь предоставить рекомендуемые параметры для этого или способ запуска сценария sql из файла.

Данный способ добавления данных, особенно для демонстрационного сайта, кажется громоздким, и я бы предпочел возможность просто запускать скрипт базы данных непосредственно из файла, который запускается один раз как часть процесса установки, а не в зависимости от процесса, который дает сбой без указания на то, что что-то пошло не так.

EDIT

Я заметил, что это вызывает исключения (идиотские ошибки преобразования datetime -> datetime2, которые должны обрабатываться структурой сущностей.)

Но отчасти проблема может заключаться в том, что моя версия Express 2010 не работает с ошибками, она кажется очень глючной при отладке.

Но проблема все еще остается. Я считаю, что это громоздкий и ошибочный способ по существу запускать сценарии sql в базе данных. И я не хочу заканчивать с огромным набором методов и классов только для настройки демонстрационного сайта, когда кто-то устанавливает мое веб-приложение в IIS.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

Если вы хотите запускать сценарии SQL из инициализатора, я бы порекомендовал добавить

using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;


        string scriptDirectory = HttpContext.Current.Server.MapPath("~/SqlScripts");
        string sqlConnectionString = context.Database.Connection.ConnectionString;
        DirectoryInfo di = new DirectoryInfo(scriptDirectory);
        FileInfo[] rgFiles = di.GetFiles("*.sql");
        foreach (FileInfo fi in rgFiles)
        {
            FileInfo fileInfo = new FileInfo(fi.FullName);
            using (TextReader reader = new StreamReader(fi.FullName))
            {
                using (SqlConnection connection = new SqlConnection(context.Database.Connection.ConnectionString))
                {
                    Server server = new Server(new ServerConnection(connection));
                    server.ConnectionContext.ExecuteNonQuery(reader.ReadToEnd());
                }
                reader.Close();
                reader.Dispose();
            }
        }

Причиной использования объектов управления SqlServer является то, что вы можете использовать «GO» в своих скриптах. тогда становится невероятно легко создавать сценарии из SSMS и вставлять сценарии в каталог SqlScripts.

Библиотеки SMO ​​можно найти по адресу:

C: \ Program Files \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.ConnectionInfo.dll C: \ Program Files \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Management.Sdk.Sfc.dll C: \ Program Files \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Smo.dll

и если вам нужна помощь в написании ваших данных

SP_Generate_Inserts

2 голосов
/ 24 апреля 2011

Пока вы не покажете фрагмент воспроизводимого кода, в котором инициализация завершится неудачно без исключения, я вряд ли верю, что это происходит.

Вы всегда можете выполнить любой сценарий SQL, вернувшись к классическому ADO.NET с SqlConnection и SqlCommand. Просто откройте файл, загрузите команды в строку и выполните их с помощью SqlCommand или Database.ExecuteSqlCommand.

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