我使用实体框架代码优先版本4创建了一个Web应用程序。我需要在安装页面上单击按钮手动创建数据库。我使用下面的代码来实现它。
public class UnitOfWork
{
private readonly MyDataContext _context;
public UnitOfWork(MyDataContext context)
{
this._context = context;
}
private static readonly Object syncObj = new Object();
public void DbInit(bool force = false)
{
lock (syncObj)
{
if (_context.Database.Exists()) return;
System.Data.Entity.Database.SetInitializer<MyDataContext>(new MigrateDatabaseToLatestVersion<MyDataContext, Configuration>());
_context.Database.Initialize(force);
...
}
}
}
问题
问题是我更新到Entity Framework 6.1.3并且此代码不再起作用。我现在收到错误:
Cannot open database "TesterDB" requested by the login. The login failed. Login failed for user 'sa'.
我的理解
1)我知道系统在不存在时正试图访问数据库。我真的希望在点击按钮时创建数据库,因此,它不会在那时创建。
2)我的凭据是正确的。我使用相同的凭据登录到SQL Management Studio。事实上,凭据在创建数据库时起作用。
我迫切需要这个解决方案,因为我的客户目前正在给我施加压力。非常感谢您的帮助。
更新1
我改变了
System.Data.Entity.Database.SetInitializer<MyDataContext>(new MigrateDatabaseToLatestVersion<MyDataContext, Configuration>());
到
System.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<DataContext>());
和
System.Data.Entity.Database.SetInitializer(new DropCreateDatabaseAlways<DataContext>());
并且错误仍然存在。
我也知道用户 sa 可以访问数据库,因为我可以在最终创建数据库时与用户一起访问它。事实上,我创建了另一个用户,问题仍然存在。
更新2
错误发生在_context.Database.Initialize(force);
答案 0 :(得分:1)
我不认为问题是EF,因为例外是明确的。
SQL数据库引擎上的sa
用户有两个常见错误:
希望它有所帮助!