EF6 Code First:登录失败更新数据库

时间:2015-03-18 06:06:57

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

我正在尝试在EF6代码第一个数据库上执行更新数据库。我所做的就是构建我的模型和datacontext,运行enable-migrations并执行添加迁移InitialCreate。一切都运作良好。

但更新数据库以两种不同的方式失败。

有一段时间我让它工作了,但它是在c:\ Users \下创建数据库文件(即MDF和日志文件)。我不想要他们。我希望它们在MVC网站的App_Data文件夹中构建(数据库模式位于单独的类库DLL中,因为它需要可以访问MVC应用程序以及控制台应用程序中的一些数据导入和按摩内容)。

我尝试通过调整连接字符串来更改数据库文件的位置,但我的更改被忽略(即数据库文件继续在c:\ Users \创建)或者我遇到了第二个错误,& #34;无法打开数据库......请求登录... blah blah blah"。然而,我可以在SSMS中打开数据库,我的Windows用户帐户是数据库的所有者。

为了好玩,我尝试从SSMS中删除并创建数据库。这很好......但是update-database命令>>仍然<<无法登录。

任何帮助解开这个烂摊子的人都会非常感激!

我的datacontext的构造函数:

public CampaignDbContext()
    : base( "Council2015", throwIfV1Schema: false )
{
    Database.SetInitializer<CampaignDbContext>( null );
}

类库app.config中的连接字符串:

<connectionStrings>
    <add name="Council2015" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=E:\\Programming\\Council2015\\Council2015\\App_Data\\Council2015.mdf;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient"/>
</connectionStrings>

update-database抛出的最新异常:

Applying explicit migrations: [201503180506326_InitialCreate].
Applying explicit migration: 201503180506326_InitialCreate.
System.Data.SqlClient.SqlException (0x80131904): Cannot open database "Council2015" requested by the login. The login failed.
Login failed for user 'KENSEI\Mark'.
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
...
Cannot open database "Council2015" requested by the login. The login failed.
Login failed for user 'KENSEI\Mark'.

其他信息:

我显然不了解连接字符串。如果我给连接字符串一个新名称(例如,Council2015a)并在CampaignDbContext中更改相应的构造函数参数,我可以使update-database工作。但它创建了一个新的数据库 - 在c:\ Users \下,我不想要它 - 而不是附加到现有的数据库文件。

此外,如果删除数据库文件或移动它们(并更新附件文件参数),则会再次出现相同的登录失败。

所以某处某事正在记住之前创建的数据库,并且&#34;拒绝&#34;放手。

这完全是反直觉的(包括为什么在连接字符串中的name参数之后命名数据库)。

2 个答案:

答案 0 :(得分:1)

我偶然发现了基本问题的答案 - 如何在您想要的地方创建数据库 - 这似乎解决了我遇到的其他问题。

使用看起来像您希望的那样的连接字符串:

<add name="Council2015" connectionString="Server=(LocalDB)\v11.0; Integrated Security=true; AttachDbFileName=E:\Programming\Council2015\Council2015\App_Data\Council2015.mdf" providerName="System.Data.SqlClient"/>

但是当你运行update-database时(在完成你需要做的任何添加迁移调用之后),确保update-database命令找到连接字符串

听起来应该会自动发生。如果您在解决方案的启动项目中创建数据库,它确实如此。因为默认情况下,update-database会查找连接字符串。

在我的情况下,我在类库项目中定义数据类,以便我可以在多个应用程序项目中使用它。所以当我在&#34; context&#34;中运行它时,update-database正在查找连接字符串的错误位置。类库项目。

选择类库作为&#34;默认项目&#34;在程序包管理器控制台中,尽管您(和我)可能会想到,但不要通知update-database的搜索过程中的连接字符串。

相反,请明确指定启动项目:

update-database -StartUpProjectName "<class library project name, in my case>"

瞧!

现在为什么找不到正确的连接字符串 - 因为我在类库项目中使用的id名称甚至没有出现在我的解决方案启动的连接字符串列表中项目 - 应该导致&#34;用户登录失败&#34;错误......好吧,那超出了我:)。还有一个糟糕的软件设计的例子,恕我直言。

答案 1 :(得分:0)

在连接字符串中尝试添加数据库用户名和密码。