Я пытаюсь написать простой для понимания класс DBContext
, который берет пользовательскую строку соединения, может запускать миграции и разрешать мне создавать миграции с помощью диспетчера пакетов.Код первой строки пользовательского подключения и миграции без использования IDbContextFactory
Кажется, я собираюсь кругами.
Я смог заставить его работать с использованием кода, который мне очень нравится. Я документально это в моем ответе на This question on connection string and migrations.
ответ Радека выглядит намного лучше, чем у меня, но я считаю, что, когда я реализую его, а затем попытаться создать миграции в диспетчере пакетов я получаю сообщение
Мишень context 'DataLayer.Context' не является конструктивным. Добавьте конструктор по умолчанию или выполните реализацию IDbContextFactory.
Где DataLayer.Context
- мой класс контекста.
Я не хочу, чтобы обеспечить реализацию IDbContextFactory
(и ответ Радека, кажется, указывает, что не требуется)
UPDATE:
я могу генерировать миграции, если я включаю конструктор нет параметр. Например
public Context() : base("ConnectionStringName") { }
Для моего создания контекста я передать имя строки подключения в app.config
public Context(string connString) : base(connString)
{
Database.SetInitializer(new CustomInitializer());
Database.Initialize(true);
}
Наконец я могу и генерировать миграции и запустить миграции баз данных, которые пользователь выбирает.
ОДНАКО: Когда я удаляю базу данных, а затем запускаю свое приложение, у меня проблемы.
Код инициализатора Я использую, по ссылке выше
public class CustomInitializer : IDatabaseInitializer<Context>
{
public void InitializeDatabase(Context context)
{
try
{
if (!context.Database.Exists())
{
context.Database.Create();
}
else
{
if (!context.Database.CompatibleWithModel(false))
{
var configuration = new Configuration();
var migrator = new DbMigrator(configuration);
migrator.Configuration.TargetDatabase =
new DbConnectionInfo(context.Database.Connection.ConnectionString);
IEnumerable<string> migrations = migrator.GetPendingMigrations();
foreach (string migration in migrations)
{
var scriptor = new MigratorScriptingDecorator(migrator);
string script = scriptor.ScriptUpdate(null, migration);
context.Database.ExecuteSqlCommand(script);
}
}
}
}
catch (Exception ex)
{
}
}
}
Когда я бросаю базу данных нового один получает созданные, но это не имеет таблиц. Это было бы потому, что мой код создания таблицы все в моей первой миграции.
Таким образом, код внутри условия !context.Database.CompatibleWithModel(false)
не запускается.
Однако, увы, код также не работает во второй раз, когда он должен иметь метаданные.
Теперь, чтобы попытаться получить миграционный ход ...
ПЕЧАЛИ: Нет с Радеком пользовательского инициализатором до сих пор.
Из комментариев NSGaga я применил выход из приложения, если я меняю соединение.
var master = new myMDIForm();
master.ConnectionType = connectionType; // being an enum of the different connection names in app.config
while (master.ConnectionType != ConnectionType.None)
{
Application.Run(master);
}
это выглядит подобный вопрос к этому раствору ответа http://stackoverflow.com/questions/15504465/entityframework-code-first-custom-connection-string-and-migrations/16133150#16133150 –