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

如果有任何模型修改,我想要重新创建数据库,并为查找表添加一些值。这两件事似乎都得到了开箱即用的支持*。

我的设置是这样的:

全球.asax

 protected void Application_Start()
 {
    Database.SetInitializer<CoreDB>(new CoreDBInitialiser());
    // et al...
 }

核心数据库.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,并且他们对数据库具有完全的读/写访问权限。事实上,他们可能应该这样做,因为该帐户也创建了数据库。
  • 正在创建数据库:删除数据库并自动重新创建。
  • 连接字符串已正确定义,包括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,所以“支持”可能不是这个词 :)

4

7 回答 7

49

我知道现在回答为时已晚,但这篇文章在 Goolge 上很受欢迎,回答可能对某人有用。问题是缺少凭据。为防止这种情况,您需要将连接字符串更改为:

Trusted_Connection=False;Persist Security Info=True

基于这篇文章

于 2011-03-28T23:09:14.120 回答
6

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

我的解决方案与需要更正 Trusted_Connection 和 Persist Security Info 的 bizon 非常相似,但我通过 Visual Studio 属性通过以下方式完成了它:

服务器资源管理器->修改连接->高级-> 然后检查Persist Security InfoTrustServerCertificate为 True,它正确格式化了连接字符串

视觉工作室 gui 的屏幕截图

于 2014-01-21T16:18:31.080 回答
5

当我在 VS2012 和 EF6 下遵循这个问题时遇到了这个问题。我的解决方案很简单:

在选择“反向工程代码优先”时弹出的连接属性对话框中,选中“保存我的密码”。

问题解决了,但是不知道具体的...

于 2013-06-05T06:28:06.367 回答
3

将此添加到您的连接字符串。它对我有用。

Integrated Security=True;Persist Security Info=True;
于 2015-12-07T14:52:36.217 回答
0

以前从未发布过,学习使用 MVC 的实体框架,使用 2010 和一个为数据库运行 SQL Server 2005 的开发数据库服务器。我主要是一个Windows应用程序的人。

教程的第一部分很好,到目前为止它创建了三个表,然后我在添加更多类和需要更改数据库结构后遇到了上面的错误。

我的修复非常残酷,我进入开发服务器并进入我的登录名,我是自己服务器上的系统管理员,这并不奇怪。所以我进入了用户映射并选择了master,然后勾选了每个框。现在可以了。

我不知道为什么这会奏效或问题是什么,但希望比我了解更多的人可以在这个“坏修复”的基础上再接再厉,并为其他有这个问题的人提供更好的解决方案。

于 2012-09-16T11:13:38.150 回答
0

I was unable to get this to work as I wanted. This answer is a bodge / opt-out, so be aware when making your decision on what to do.

I have reverted away from Code-First for the meanwhile until it's at a more stable version. For anyone who is having this problem with the CTP4 as well, then you can get around it by losing your initializer and passing NULL into the SetInitializer method.

Database.SetInitializer<CoreDB>(null);

This of course means that you need to maintain your database each time you make a change, or change it for a single run and then change it back after it creates the DB.

于 2010-12-02T08:25:44.370 回答
0

我输入了错误的密码。措辞奇怪的例外。

于 2016-05-03T12:22:54.223 回答