在EF4中自动创建数据库的问题

时间:2011-07-15 07:22:04

标签: sql-server entity-framework-4.1

我正在使用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目录中。 我该如何处理?

1 个答案:

答案 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服务器仍然认为数据库存在。这也是为什么你必须改变名称才能使它发挥作用的原因。

相关问题