【问题标题】:EF 5 + Azure + MigrationFirst overrides database name. Why?EF 5 + Azure + MigrationFirst 覆盖数据库名称。为什么?
【发布时间】:2013-03-31 01:39:33
【问题描述】:

我在 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 模式填充表。 但是,使用我的上下文的完整命名空间名称生成了一个新数据库: MyService.Business.Entity.MyContext

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

【问题讨论】:

  • 如果你不传递连接字符串,如下面的 Chris 所示,EF 将尝试使用名称与上下文名称相同的配置文件中的连接字符串。如果找不到,它将创建自己的连接字符串,其中将根据上下文名称创建数据库名称
  • 感谢您的解释!

标签: sql entity-framework azure database-migration


【解决方案1】:

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

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

【讨论】:

  • 奇怪的是需要指定两次数据库才能使其工作,但至少它可以工作。谢谢!
  • 您没有两次指定它。通常我不指定连接工厂的连接字符串,只在标准的 connectionStrings 配置部分中指定一个。
【解决方案2】:

我的经验是,在连接字符串是在代码中传递的情况下,而不是从 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"){}

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

我仍然很困惑,我必须这样做并询问过它here

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多