首先,我不是SQL专家......
我的假设是:不要让任何应用程序用户访问masterdb
至少这是我通常在我们的共享Azure SaaS SQL主机上运行的默认设置。
我准备了各种建议,告诉你这样做:
Database.SetInitializer<AppDataContext>(null);
据我所知,完全禁用自动迁移 我想要自动(模式)迁移 - 我只是不希望EF创建新数据库(或检查数据库是否存在于masterdb中)。
什么是正确的解决方案?
更新1:我没有对源代码进行反编译,而是查看了MigrateDatabaseToLatestVersion
的单声道实现。
/// <inheritdoc />
public void InitializeDatabase(TContext context)
{
Check.NotNull(context, "context");
var migrator = new DbMigrator(_config);
migrator.Update();
}
...和migrator.Update();将执行此操作... targetMigration为null。
public override void Update(string targetMigration)
{
base.EnsureDatabaseExists(() => UpdateInternal(targetMigration));
}
这基本上会调用UpdateInternal() - 它只负责迁移。没有数据库存在,对吧?我会调查一下。
更新2:
我可以看到以下电话:
IF db_id(N'my-database') IS NOT NULL SELECT 1 ELSE SELECT Count(*) FROM sys.databases WHERE [name]=N'my-database'
但那很好 - 不需要主数据库访问。
答案 0 :(得分:0)
我的理解是,这是实体框架中的错误。在此处查看MS员工在GitHub上的错误报告
“ ......看来DbMigrator执行的数据库存在检查存在问题,它正在尝试连接到master数据库,但失败了。我们已更新了其他存在检查以不要求这样做,但似乎DbMigrator要么被遗漏,要么是由于某些原因无法在此处完成...”