VS 2013 MVC5代码第一个项目。
我正在使用ASP.NET Getting Started with EF6 using MVC5教程来快速了解最新的更改,并且我遇到了迁移问题。 在第一个模块中,使用数据库初始化程序创建数据库:
<contexts>
<context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
<databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
</context>
</contexts>
和这个连接字符串:
<connectionStrings>
<add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity1;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>
这很好用。在Code First迁移和部署模块中,将设置迁移。初始化程序已注释掉,DB的名称更改为ContosoUniversity2:
<connectionStrings>
<add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>
然后从Packager Manager Console运行update-database
时,它失败并显示错误消息:
Cannot open database "ContosoUniversity2" requested by the login. The login failed.
Login failed for user 'MyMachine\MyUser'.
我使用相同的用户和相同的结果多次重新运行这两种方案。如果我将Initial Catalog
更改为AttachDbFilename=|DataDirectory|\ContosoUniversity2;
update-database
成功(数据库现在位于项目的App-Data文件夹中,而不是用户个人资料的根目录):
<connectionStrings>
<add name="SchoolContext" connectionString="Data Source=(LocalDb)\v11.0; AttachDbFilename=|DataDirectory|\ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
</connectionStrings>
虽然在部署时必须使用Initial Catalog
。生产connectionString在Web.Release.Config中单独设置,以便可行。
问题是为什么需要修复,为什么Initial Catalog
不能在开发方面使用update-database
?
更新1:
问题不在于迁移,而在于LocalDb
MyUser
拥有SQLExpress
(sysadmin
)的完全权利。我可以在SSMS
下登录MyUser
并完全管理DBs
。我做了几次测试。即使我为教程创建了初始数据库MyUser
,如果我从头开始重建应用程序并使用databaseInitialzer
,它现在会抛出登录失败错误。如果我在VS
下Admin
运行databaseInitialzer
,update-database
和DBs
工作没有任何问题。如果我将Admin's
从MyUser's
用户个人资料根目录复制到VS
,然后运行Admin
,而不是MyUser
,同时登录为{{1}如果databaseInitialzer
先前存在,则update-database
和DB
都可以正常工作。
如果我将connectionString
更改为AttachDbFileName
并运行databaseInitialzer
和update-database
MyUser
可以在{{1}中创建DB
文件夹证明App_Data
具有MyUser
创建权限。 DB
显然拥有自己用户个人资料的根目录的完全权限。 LocalDb实施有一些问题。
有没有人对这个问题有任何见解?
答案 0 :(得分:15)
如果删除了DB文件,它仍然会在SqlLocalDB中注册。如果LocalDb挂起而无法附加(手动删除DB文件后)或登录失败,请参阅JSobell和CodingwithSpike的答案:
ef5-cannot-attach-the-file-0-as-database-1
从PM控制台运行'sqllocaldb.exe stop v11.0'和'sqllocaldb.exe delete v11.0'
<强>更新强>
更容易使用SSMS。服务器名称:(本地)\ v11.0,Windows身份验证。这确实是管理localdb数据库的最佳方式。
答案 1 :(得分:6)
我正在使用VS 2013和EF6.1。
当我使用迁移和删除数据库时,我遇到了类似的错误。 我无法再次重新创建数据库。 发现由于SQLExpress本地数据库实例导致的错误在后台运行并保持已删除的数据库连接。
以下是处理这种情况的步骤。
答案 2 :(得分:2)
我将“标准安全性”更改为“可信连接”
Server = myServerAddress; Database = myDataBase; Trusted_Connection = True;
在appsetting.json中,您可以编写此代码
`{
"ConnectionStrings": {
"onlineStoreDB": "Server=.;Database=onlineStore;Trusted_Connection=True"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}`
对我有用。
答案 3 :(得分:1)
从连接字符串
进行交换数据源=(LocalDb)\ v11.0;
到
服务器= \的SQLExpress;
这有助于我在迁移过程中使用Code First技术
答案 4 :(得分:0)
这将解决您的问题,您可以根据需要更新和添加任意数量的方法和属性
注意:第1步{如果您在教程中启动了数据库}
从PM控制台:
启用 - 迁移--ContextTypeName ContosoUniversity.DAL.SchoolContext
add-migration Initial
更新的数据库
答案 5 :(得分:0)
我有点迟了但我在做Getting Started with EF6 using MVC5时遇到了同样的问题。
由于示例中的数据库初始化无效,出现此问题。
更改
public class SchoolInitializer : System.Data.Entity. DropCreateDatabaseIfModelChanges<SchoolContext>
到
public class SchoolInitializer : CreateDatabaseIfNotExists<SchoolContext>
它将创建没有问题的数据库。
默认情况下,示例中使用的初始化方法不会创建新数据库。不确定它是不是一个bug。
答案 6 :(得分:0)
'PM>启用迁移 Enable-Migrations已过时。使用添加迁移来开始使用迁移。'