EF4 Code-First引起了InvalidOperationException异常

28

每次构建后运行项目时,我遇到了一个问题。看起来初始化程序在运行时没有问题,但当它进行第一个查询时,就会出现以下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,所以 "支持" 可能不是合适的词语 :)


即使我遇到错误,但刷新后我仍然可以连接到数据库。 - Novice
我建议您重新编写问题标题。我非常确定EF4本身不会引起任何问题。 - Diego Mijelshon
刚遇到这个问题,我正在使用 VS2012 的选择,但似乎没有地方可以输入连接字符串中的其他选项。 - tofutim
7个回答

49

我知道现在回答已经有点晚了,但是这篇文章在谷歌上排名靠前,所以答案对某些人可能仍然有用。问题在于缺少凭据。为了避免这种情况发生,您需要更改连接字符串以具备以下内容:

Trusted_Connection=False;Persist Security Info=True

根据这篇文章


我目前无法测试此内容,因为我在我的开发机上没有安装CTP4。但是我会点赞并回答,希望对谷歌搜索者有所帮助 :) - Amadiere
2
Entity Framework 4.1 Update 1 包含一个 bug 修复程序,用于在使用 SQL 认证时从连接字符串中删除指定“Persist Security Info=True”的需要。 http://www.microsoft.com/download/en/details.aspx?id=26825 - Rami A.
我在使用EF 4.1.x时仍然遇到了这个错误,但是由于这个答案的帮助,我刚刚升级到了最新版本(4.3.1),问题已经解决了。 - lukkea
...而且我不需要持久化安全信息(在我的设置中,受信任的连接默认为false)。 - lukkea
4
我曾使用名为“连接属性”的Visual Studio用户界面来连接我的数据库,需要点击“高级”->然后将“Persist Security Info”和“TrustServerCertificate”都勾选为True,这样它会按你所描述的格式化连接字符串。 - Ben Anderson
@BenAnderson,您能否基于使用连接属性将其作为单独的答案添加?我曾经处于同样的情况,您的评论对我帮助更大。 - default

6

根据要求,我将我的评论发布为答案。

我的解决方案与bizon非常相似,Trusted_Connection和Persist Security Info需要进行更正,但我通过visual studio属性完成了这个操作:

服务器资源管理器 -> 修改连接 -> 高级 -> 然后将Persist Security InfoTrustServerCertificate都勾选为True,它就会正确格式化连接字符串

visual studio界面截图


使用EF PowerTools或EF POCO插件时,这是正确的答案。 - Mike P.

5

在我按照 这个链接 使用 VS2012 和 EF6 时,遇到了这个问题。我的解决方案很简单:

在选择“Reverse Engineer Code First”时弹出的“连接属性”对话框中,勾选“保存我的密码”。

问题已解决,但我不知道具体细节...


这对我有效,但我不知道为什么它失败了。我已经在连接字符串中添加了凭据。 - DarkMakukudo

3

将这个添加到你的连接字符串中。对我来说有效。

Integrated Security=True;Persist Security Info=True;

0

我之前从未发布过任何内容,正在学习使用MVC的Entity Framework,使用2010和运行SQL Server 2005的开发数据库服务器。我主要是Windows应用程序开发人员。

教程的第一部分进行得很顺利,到目前为止已经创建了三个表,然后在添加一些类和需要改变数据库结构后遇到了上面的错误。

我的解决方案非常暴力,我进入了开发服务器并进入了我的登录名,我是自己服务器上的系统管理员,这并不奇怪。所以我进入了用户映射并选择了master,然后勾选了每个框。现在它可以正常工作了。

我不知道为什么这样做有效或者问题出在哪里,但希望比我更懂的人能够基于这种“糟糕的解决方法”并为其他遇到此问题的人提供更好的解决方案。


0

我输入了错误的密码。异常信息措辞奇怪。


0

我无法按照自己的意愿使其正常工作。这个答案是一种临时的解决方案,所以在做出决定时要注意。

我已经暂时放弃了 Code-First,直到它有一个更稳定的版本。 对于任何遇到 CTP4 问题的人,你可以

Database.SetInitializer<CoreDB>(null);

这当然意味着每次更改时都需要维护您的数据库,或者在单个运行之前更改它,然后在创建DB之后将其改回来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接