我正在尝试在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参数之后命名数据库)。
答案 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)
在连接字符串中尝试添加数据库用户名和密码。