Entity Framework 6 - SqlConnection Open() 有效但 EF 尝试再次创建数据库 - 外部托管
Entity Framework 6 - SqlConnection Open() works but EF tries to Create Database again - External Hosting
我在 1&1.co.uk 托管的外部服务器上安装了一个 ASP.NET MVC 6 Web 应用程序(带有 WebApi)(访问受限工具)。服务器是 运行ning Windows Server 2016 Standard 和 SQL Server 2017 RTM。
我使用他们的 myLittleAdmin
工具创建了数据库,并使用 EF Update-Database -Verbose
的 SQL 输出创建了表。桌子看起来不错。
每当 Entity Framework 调用 DbContext 时生成的错误是
FAILED: CREATE DATABASE permission denied in database 'master'
这意味着当数据库已经存在并且我的连接字符串在 SqlConnection
实例中工作时,EF 正在尝试创建一个新数据库。
我想得到帮助的奇怪事情是我已经在 SqlConnection
实例中测试了连接字符串,该实例可以正常连接到数据库而不会崩溃。
问题:Entity Framework和DbContext
与SqlConnection
有何不同?我该怎么做才能让 Entity Framework 使用现有数据库?
string connStr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
try
{
conn.Open();
message = "Connection opened."; // THIS WORKS!
conn.Dispose();
}
catch (Exception e)
{
message = $"FAILED: { e.Message}\n{e.StackTrace}\n{e.Source}, Connection String: {connStr}";
}
}
我通过在服务器上设置的测试控制器调用此函数,该服务器 returns 通过 ViewBag 向视图发送消息。但是任何试图调用 EF 的函数都会因上述错误而失败。
真正令人抓狂的是几周前我可以在服务器上注册新用户,但我需要核对数据库,因为我的实体 ID 设置为 int 而不是字符串。而现在这个。
注意:据我所知,我没有对服务器、IIS 或 SQL 管理器终端的远程桌面访问权限,只有我可以 运行 SQL 查询的 noddy myLittleAdmin 终端。哦,还有一个无用的支持台电话。
评论中提供完整的 Stacktrace!
已解决:发现 this answer by Ray,一行奇迹!
在Global.asax的Application_Start()方法中,添加:
using System.Data.Entity;
protected void Application_Start()
{
Database.SetInitializer<ApplicationDbContext>(null);
...
}
文档说明如下:
// Summary:
// Sets the database initializer to use for the given context type. The database
// initializer is called when a the given System.Data.Entity.DbContext type is used
// to access a database for the first time. The default strategy for Code First
// contexts is an instance of System.Data.Entity.CreateDatabaseIfNotExists`1.
//
// Parameters:
// strategy:
// The initializer to use, or null to disable initialization for the given context
// type.
我在 1&1.co.uk 托管的外部服务器上安装了一个 ASP.NET MVC 6 Web 应用程序(带有 WebApi)(访问受限工具)。服务器是 运行ning Windows Server 2016 Standard 和 SQL Server 2017 RTM。
我使用他们的 myLittleAdmin
工具创建了数据库,并使用 EF Update-Database -Verbose
的 SQL 输出创建了表。桌子看起来不错。
每当 Entity Framework 调用 DbContext 时生成的错误是
FAILED: CREATE DATABASE permission denied in database 'master'
这意味着当数据库已经存在并且我的连接字符串在 SqlConnection
实例中工作时,EF 正在尝试创建一个新数据库。
我想得到帮助的奇怪事情是我已经在 SqlConnection
实例中测试了连接字符串,该实例可以正常连接到数据库而不会崩溃。
问题:Entity Framework和DbContext
与SqlConnection
有何不同?我该怎么做才能让 Entity Framework 使用现有数据库?
string connStr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
try
{
conn.Open();
message = "Connection opened."; // THIS WORKS!
conn.Dispose();
}
catch (Exception e)
{
message = $"FAILED: { e.Message}\n{e.StackTrace}\n{e.Source}, Connection String: {connStr}";
}
}
我通过在服务器上设置的测试控制器调用此函数,该服务器 returns 通过 ViewBag 向视图发送消息。但是任何试图调用 EF 的函数都会因上述错误而失败。
真正令人抓狂的是几周前我可以在服务器上注册新用户,但我需要核对数据库,因为我的实体 ID 设置为 int 而不是字符串。而现在这个。
注意:据我所知,我没有对服务器、IIS 或 SQL 管理器终端的远程桌面访问权限,只有我可以 运行 SQL 查询的 noddy myLittleAdmin 终端。哦,还有一个无用的支持台电话。
评论中提供完整的 Stacktrace!
已解决:发现 this answer by Ray,一行奇迹!
在Global.asax的Application_Start()方法中,添加:
using System.Data.Entity;
protected void Application_Start()
{
Database.SetInitializer<ApplicationDbContext>(null);
...
}
文档说明如下:
// Summary:
// Sets the database initializer to use for the given context type. The database
// initializer is called when a the given System.Data.Entity.DbContext type is used
// to access a database for the first time. The default strategy for Code First
// contexts is an instance of System.Data.Entity.CreateDatabaseIfNotExists`1.
//
// Parameters:
// strategy:
// The initializer to use, or null to disable initialization for the given context
// type.