EntityFramework代码第一个自定义连接字符串和迁移 [英] EntityFramework code-first custom connection string and migrations

查看:164
本文介绍了EntityFramework代码第一个自定义连接字符串和迁移的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我使用默认连接字符串(从 app.config 中读取)创建一个上下文时,数据库被创建,并且迁移工作 - 基本上是一切顺序。而连接字符串是以程序方式创建的(使用 SqlConnectionStringBuilder ):




  • 数据库isn在数据库不存在时创建(方案 A );

  • CreateDbIfNotExists()创建数据库模型的最新版本,但调用迁移机制(方案 B )。



A 当我希望访问数据库时会抛出异常,因为 - 显然 - 它不在那里。在 B 数据库中正确创建迁移机制是,标准连接字符串中的情况。



app.config
数据源= localhost\\SQLEXPRESS;初始目录= Db13;用户ID = xxx;密码= xxx



构建器

  sqlBuilder.DataSource = x.DbHost; 
sqlBuilder.InitialCatalog = x.DbName;
sqlBuilder.UserID = x.DbUser;
sqlBuilder.Password = x.DbPassword;

初始化工具



$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
$

规范
实体框架:5.0,DB:SQL Server Express 2008

解决方案

如果您的迁移无法正常尝试设置 Database.Initialize(true) 在DbContext ctor中。

  public CustomContext(DbConnection connection)
:base(connection, true)
{
Database.Initialize(true);
}

我有类似的迁移问题。在我的解决方案中,我必须始终在ctor中设置数据库初始化器,如下所示

  public CustomContext(DbConnection connection)
:base(connection,true)
{
Database.SetInitializer(new CustomInitializer());
Database.Initialize(true);
}

在自定义初始化工具中,您必须实现 InitalizeDatabase(CustomContex上下文)方法,例如。

  class CustomInitializer:IDatabaseInitializer< CustomContext> 
{
public void InitializeDatabase(CustomContext context)
{
if(!context.Database.Exists ||!context.Database.CompatibleWithModel(false))
{
var configuration = new Configuration();
var migrator = new DbMigrator(configuration);
migrator.Configuration.TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString,System.Data.SqlClient);
var migrations = migrator.GetPendingMigrations();
if(migrations.Any())
{
var scriptor = new MigratorScriptingDecorator(migrator);
string script = scriptor.ScriptUpdate(null,migrations.Last());
if(!String.IsNullOrEmpty(script))
{
context.Database.ExecuteSqlCommand(script);
}
}
}
}
}

更新


When I create a context with a default connection string (as read from the app.config) the database is created and the migrations work - basically everything is in order. Whereas when the connection string is created programatically (using SqlConnectionStringBuilder):

  • database isn't created when the database is not present (scenario A);
  • CreateDbIfNotExists() creates the newest version of database model but the migration mechanisms are not invoked (scenario B).

In A an exception is thrown when I wish to access the database, as - obviously - it isn't there. In B database is created properly migration mechanisms are not called, as is the case in standard connection string.

app.config: "Data Source=localhost\\SQLEXPRESS;Initial Catalog=Db13;User ID=xxx;Password=xxx"

builder:

sqlBuilder.DataSource = x.DbHost;
sqlBuilder.InitialCatalog = x.DbName;
sqlBuilder.UserID = x.DbUser;
sqlBuilder.Password = x.DbPassword;

initializer:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<
        MyContext,
        Migrations.Configuration
    >()
);

Specs: Entity Framework: 5.0, DB: SQL Server Express 2008

解决方案

If your migration does not work correctly try to set Database.Initialize(true) in DbContext ctor.

public CustomContext(DbConnection connection)
: base(connection, true)    
{    
        Database.Initialize(true);    
}    

I have similar problem with migrations. And in my solution I have to always set database initializer in ctor, like below

public CustomContext(DbConnection connection)
: base(connection, true)    
{    
        Database.SetInitializer(new CustomInitializer());
        Database.Initialize(true);    
}    

In custom initializer you have to implement InitalizeDatabase(CustomContex context) method, eg.

class CustomInitializer : IDatabaseInitializer<CustomContext>
{
    public void InitializeDatabase(CustomContext context)
    {
        if (!context.Database.Exists || !context.Database.CompatibleWithModel(false))
        {
            var configuration = new Configuration();
            var migrator = new DbMigrator(configuration);
            migrator.Configuration.TargetDatabase = new DbConnectionInfo(context.Database.Connection.ConnectionString, "System.Data.SqlClient");
            var migrations = migrator.GetPendingMigrations();
            if (migrations.Any())
            {
                var scriptor = new MigratorScriptingDecorator(migrator);
                string script = scriptor.ScriptUpdate(null, migrations.Last());
                if (!String.IsNullOrEmpty(script))
                {
                    context.Database.ExecuteSqlCommand(script);
                }
            }
        }
    }
}

UPDATED

这篇关于EntityFramework代码第一个自定义连接字符串和迁移的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆