我正在使用Entity Framework Code First学习ASP.NET MVC 3。我正在按照教程进行操作,并在本地计算机上下载了相应的测试解决方案。现在,我不太了解的是关于数据库的自动创建(如果这个数据库还没有存在于磁盘上)。我第一次运行应用程序时,会为我创建数据库。没关系。
以下是Web.config中的部分
<add name="BlogContext"
connectionString="Data Source=.\SQL2008;Initial Catalog=CodeFirstMVC.mdf;Integrated Security=SSPI"
providerName="System.Data.SqlClient" />
但我有两个问题:
1st。出于测试目的,我删除了磁盘上的数据库并再次运行解决方案。我以为数据库会自动创建,但我错了:我收到了以下错误消息:
{"Unable to open the physical file \"c:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQL2008\\MSSQL\\DATA\\CodeFirstMVC.mdf.mdf\". Operating system error 2: \"2(failed to retrieve text for this error. Reason: 15105)\".\r\nCannot open database \"CodeFirstMVC.mdf\" requested by the login. The login failed.\r\nLogin failed for user 'sa'.\r\nFile activation failure. The physical file name \"c:\\Program Files\\Microsoft SQL Server\\MSSQL10.SQL2008\\MSSQL\\DATA\\CodeFirstMVC.mdf_log.LDF\" may be incorrect."}
我注意到如果我在Web.config中更改了文件名,则会再次成功创建数据库。 您能解释一下吗?为什么我必须更改数据库名称才能让它再次运行?
2nd。数据库是在位于C:\ Program Files \ Microsoft SQL Server \ MSSQL10.SQL2008 \ MSSQL \ DATA的文件夹中创建的。我想将我的数据库存储在App_Data目录中。 我该如何处理?
答案 0 :(得分:1)
Initial catalog
不是文件路径。它是数据库的名称。 AttachDbFilename
用于指定文件,因此您的连接字符串应如下所示:
Data Source=.\SQL2008;Initial Catalog=CodeFirstMVC;AttachDbFilename=|DataDirectory|CodeFirstMVC.mdf;Integrated Security=SSPI
其中|DataDirectory|
指示SQL Server使用本地应用程序数据目录而不是全局SQL Server数据目录。 Web应用程序的本地数据目录为App_Data
。
编辑:
我刚注意到你可能正在使用完整的SQL服务器而不是SQL server express。据我所知,自动在App_Data中创建数据库是SQL server express的特色。这也解释了第一个错误,因为SQL Server创建了名为CodeFirstMVC.mdf的数据库,并将数据库存储在CodeFirstMVC.mdf.mdf文件中的全局数据目录中以及CodeFirstMVC.mdf.ldf文件中的事务日志中。它还在内部注册了该数据库。通过删除文件,您没有从SQL服务器中删除数据库。您只是打破其功能,但SQL服务器仍然认为数据库存在。这也是为什么你必须改变名称才能使它发挥作用的原因。