每次构建后运行项目时,我遇到了一个问题。看起来初始化程序在运行时没有问题,但当它进行第一个查询时,就会出现以下InvalidOperationException
异常。
This operation requires a connection to the 'master' database. Unable to create a
connection to the 'master' database because the original database connection has
been opened and credentials have been removed from the connection string. Supply
an unopened connection.
仅供参考,我正在使用通过NuGet直接引入的EF Code First CTP4。连接到SQL Server 2008 R2。
我希望发生的情况是,在模型有任何修改的情况下重新创建数据库,并为查找表种子填充几个值。这两件事似乎都可以直接支持。
我的设置如下:
Global.asax
protected void Application_Start()
{
Database.SetInitializer<CoreDB>(new CoreDBInitialiser());
// et al...
}
CoreDB.cs
public class CoreDB : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Login> Logins { get; set; }
public DbSet<Permission> Permissions { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<RolePermission> RolePermissions { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
public DbSet<Setting> Settings { get; set; }
}
public class CoreDBInitialiser : RecreateDatabaseIfModelChanges<CoreDB>
{
protected override void Seed(CoreDB context)
{
var settings = new List<Setting>
{
new Setting
{
SettingName = "ExampleSetting",
SettingValue = "This is a sample setting value",
}
};
settings.ForEach(d => context.Settings.Add(d));
}
}
当它运行时,它会在类似于这样的一行上死掉,基本上是在创建数据库之后遇到的第一个查询。User data = (from u in _data.Users where u.Username == userName select u).SingleOrDefault();
我认为这不是:
- 权限问题: 我已经在 SQL Server 中删除了实际的数据库。应用程序会在尝试运行查询时重新创建它(初始化程序已设置,然后显然会暂停创建直到需要)。我也以 Web.config 中指定的用户登录到 SQL Server,他们对数据库具有完全的读写访问权限。实际上,他们可能应该具备这些权限,因为该帐户还创建数据库。
- 正在创建数据库: 删除 DB 并自动重新创建没有问题。
- 连接字符串定义正确,包括
providerName
属性。
<add name="CoreDB" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TheDatabase;User Id=TheUsername;Password=ThePassword;" providerName="System.Data.SqlClient" />
- 这似乎并不是我的代码/逻辑中的错误,因为一旦查询成功失败,代码就会正常工作,直到下次应用程序被重建。显然有可能,无论如何,我都必须在我的代码中应用一个解决方法。 :)
怎么办?
理想情况下,我希望 "不太关心数据库架构"。我希望像 Scott Gu 的出色博客文章(以及用于现有数据库的后续操作)中显示的那样,一切都可以工作并消失。在很大程度上,这是正确的。似乎存在一个连接未关闭的问题,但我找不到如何解决这个问题的方法。
一些论坛/SO 帖子表明我遇到的问题基本上是因为初始化程序未按计划工作且可能会保留连接。其他地方的解决方案似乎是简单地 "不要创建自己的初始化程序",这不是最好的解决方案-除非有人有任何想法,否则我可能不得不等到 CTP5。
*是的,我知道这是 CTP,所以 "支持" 可能不是合适的词语 :)