EF4 Code-First导致InvalidOperationException

时间:2010-12-01 11:54:11

标签: c# database entity-framework code-first ef-code-first

每次构建项目时尝试运行我的项目时遇到问题。似乎初始化程序运行,但是当涉及第一个查询时 - 它会死于以下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,并且他们对数据库具有完全的读/写访问权限。事实上,他们可能应该这样做,因为该帐户也创建了数据库。
  • 正在创建数据库:删除数据库并自动重新创建数据。
  • 正确定义了连接字符串,包括providerName属性。

<add name="CoreDB" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TheDatabase;User Id=TheUsername;Password=ThePassword;" providerName="System.Data.SqlClient" />

  • 出现是我的代码/逻辑中的错误,因为一旦查询成功失败,代码将正常启动,直到下次重建应用程序为止< / strong>即可。显然可能是这样,而且无论如何我可能不得不在我的代码中应用一个解决方法。 :)

怎么做?

理想情况下,我想“不要考虑数据库架构”。我希望它能像Scott Gu's excellent blog post一样(并跟进working with existing databases),事情刚刚解决并消失了。在大多数情况下,这是事实。这似乎是一个问题,连接在某些时候没有被关闭,但我无法找到如何纠正这个问题。

few forum / SO帖子确实意味着我遇到的问题基本上是因为初始化程序没有完全按计划工作,并且连接可能保持打开状态。其他地方的解决方案似乎只是“不创建自己的初始化程序”,这不是最好的解决方案 - 但除非有人有任何想法,否则我可能不得不这样做直到CTP5。

*是的,我知道这是一个CTP,所以“支持”可能不是这个词:)

7 个答案:

答案 0 :(得分:48)

我知道答案是迟到的,但这个帖子在Goolge上很高,答案可能对某人有用。问题是缺少凭据。为防止这种情况,您需要更改连接字符串:

Trusted_Connection=False;Persist Security Info=True

基于this article

答案 1 :(得分:6)

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

我的解决方案与bizon非常相似,其中Trusted_Connection和Persist Security Info需要更正,但我通过视觉工作室属性完成了它:

服务器资源管理器 - &gt; 修改连接 - &gt; 高级 - &gt;然后检查持久安全信息 TrustServerCertificate 为True,并正确格式化连接字符串

screenshot of visual studio gui

答案 2 :(得分:5)

在VS2012和EF6下关注this时遇到此问题。我的解决方案非常简单:

在选择“Reverse Engineer Code First”时弹出的Connection Properties对话框中,选中“Save my password”。

问题解决了,但我不知道有关它的细节......

答案 3 :(得分:3)

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

Integrated Security=True;Persist Security Info=True;

答案 4 :(得分:0)

我无法按照我的意愿让这个工作。这个答案是一个bodge / opt-out,所以在决定做什么时要注意。

我已经恢复了Code-First,直到它处于一个更稳定的版本。 对于任何遇到CTP4问题的人来说,你可以通过丢失初始值并将NULL传递给SetInitializer方法来绕过它。

Database.SetInitializer<CoreDB>(null);

这当然意味着您需要在每次进行更改时维护数据库,或者在一次运行中更改数据库,然后在创建数据库后将其更改回来。

答案 5 :(得分:0)

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

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

我的修复非常残酷,我进入开发服务器并进入我的登录,我在自己的服务器上是一个系统管理员,这并不奇怪。所以我进入了用户映射并选择了主人,只需勾选每个方框。它现在有效。

我不知道为什么这会有效或者问题是什么,但希望能比我更了解的人可以建立在这个“糟糕的解决方案”的基础上,并让那些有这个问题的人更好。

答案 6 :(得分:0)

我的密码错了。奇怪的措辞异常。