我创建了一个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>());
}
答案 0 :(得分:0)
不应该使用实体框架,它永远不会为您创建数据库,除非您明确要求它为您创建一个数据库(如果它不存在)。
您需要将其添加到上下文的构造函数代码中:
if (!Database.Exists())
{
Database.Create();
}
或者您可以使用适合您的数据库初始化策略,例如:
Database.SetInitializer<MyContextDb>(new CreateDatabaseIfNotExists<MyContextDb>());