数据库未自动创建

时间:2017-05-27 20:55:26

标签: c# sql-server asp.net-mvc entity-framework

我创建了一个ASP.NET MVC 4项目。我知道只要有一个DbContext派生类,如果我实例化这个类,如:

MyContextDb _db = new MyContextDb();

并询问它的数据,它应该出去看看数据库是否存在。如果该数据库不存在,则应该为我创建它。

但是,我正在测试这个理论并且它不起作用。我的MyDbContext课程中有一个属性:

public DbSet<Restaurant> Restaurants { get; set; } 

对于这个属性,我在Models文件夹中有一个类:

public class Restaurant
{
        public int Id { get; set; }
        public string Name { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
}

这是我在互联网上找到的教程的一部分。我构建项目(通过我有Entity Framework 6.1.3和SQL Server 2016 Express版本的方式),我得到的错误是:

  

类型&#39; System.Data.SqlClient.SqlException&#39;的异常发生在EntityFramework.dll中但未在用户代码中处理

     

其他信息:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供程序:SQL网络接口,错误:50 - 发生本地数据库运行时错误。无法创建自动实例。请参阅Windows应用程序事件日志以获取错误详细信息。

这是我的连接字符串,添加到配置部分中的web.config文件中:

<connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=.\v13.0;Initial Catalog=aspnet-mydb-20170527102515;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-mydb-20170527102515.mdf" 
         providerName="System.Data.SqlClient" />
</connectionStrings>

不确定还有什么可以尝试。我能够通过localhost(或点)访问SQL Server而无需凭据,通过Windows身份验证,我已将SQL Server设置为允许远程连接并允许混合模式身份验证(通过凭据或通过Windows)。有什么想法吗?相当常见的情况,但我到目前为止似乎没有尝试过任何帮助。

我还尝试了UDL技巧(保存带有.udl扩展名的文件,双击它,输入参数以在小对话界面中连接,并在成功测试连接后,然后打开udl作为文本,这样的东西显示起来:

<add name="Def" 
     connectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=anotherDb;Data Source=."/>

然后我用我想要的数据库名称替换anotherDb中的web.config,希望它由ASP.NET创建,但不是。)

我还应该尝试什么?

===========

我通过将其添加到web.config

来实现它
 <add name="connStr" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=D:\mvcpath\begin\course1\MyProj\App_Data\Database123.mdf;Integrated Security=True" providerName="System.Data.SqlClient"/>

并将此作为构造函数:

public MyContextDb() : base("connStr")
{
    Database.SetInitializer<MyContextDb>(new CreateDatabaseIfNotExists<MyContextDb>());
}

1 个答案:

答案 0 :(得分:0)

不应该使用实体框架,它永远不会为您创建数据库,除非您明确要求它为您创建一个数据库(如果它不存在)。

您需要将其添加到上下文的构造函数代码中:

if (!Database.Exists())
{
    Database.Create();
}

或者您可以使用适合您的数据库初始化策略,例如:

Database.SetInitializer<MyContextDb>(new CreateDatabaseIfNotExists<MyContextDb>());