EF 5 + Azure + MigrationFirst会覆盖数据库名称。为什么?

时间:2013-04-08 20:17:01

标签: sql entity-framework azure database-migration

我在Azure中创建了一个数据库,设置了我自己的自定义名称。然后,我创建了EF 5代码第一个实体并添加了迁移。在应用程序启动时,我调用了这两行:

        Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString);
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataContext, MyConfiguration>());

连接字符串直接来自Azure: Server = tcp:xxx.database.windows.net,1433; Database = dbName; User ID = yyy; Password = zzz; Trusted_Connection = False; Encrypt = True; Connection Timeout = 30;

在第一次调用时,我希望数据库dbName根据POCO模式填充表。 但是,使用我的上下文的完整命名空间名称生成一个NEW数据库: MyService.Business.Entity.MyContext

为什么迁移不接受连接字符串中指定的数据库名称?

2 个答案:

答案 0 :(得分:1)

我的经验是,在连接字符串在代码中传递而不是从app.config获取的情况下,EF对于如何获取连接字符串很古怪。

我必须添加一个继承自IDBContectFactory

的类
  public class ContextFactory : IDbContextFactory<Context>
  {
    public Context Create()
    {
        var s = (string)AppDomain.CurrentDomain.GetData("ConnectionString");
        var context = new Context(s);

        return context;
    }
}

另外,为了创建迁移,我在上下文类

中需要以下内容
// uncomment when creating migration - comment out after migration is created
public Context() : base("ConnectionStringName"){}

在我的app.config中设置了ConnectionStringName。

我仍然感到神秘,我不得不这样做,并询问了它here

答案 1 :(得分:1)

您可以在DbContext的构造函数中指定数据库名称或连接字符串名称:

public class MyDataContext : DbContext
{
    public MyDataContext: base("DbNameOrConntectionStringNameHere")
    {
    }
}