如何在 C# MVC 应用程序中在运行时创建 SQL Server Express 数据库?

Posted

技术标签:

【中文标题】如何在 C# MVC 应用程序中在运行时创建 SQL Server Express 数据库?【英文标题】:How do I create a SQL Server Express database at runtime in a C# MVC App? 【发布时间】:2012-10-03 02:01:01 【问题描述】:

我正在尝试在 MVC3 Web 应用程序中使用 C# 中的 Entity Framework 5 来执行此操作:

// Local DB connection
var dbId = String.Format(@"Data Source=.\SQLEXPRESS;AttachDbFilename=0.mdf;Database=Tests;Integrated Security=True;Pooling=False;Connect Timeout=30;User Instance=True", _dbPath);
_connection = new SqlConnection(dbId);

Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>());

// Reset database if the file exists
var ctx = new MyContext(_connection);
ctx.Database.CreateIfNotExists();
ctx.Database.Initialize(true);
ctx.SaveChanges();

return _connection;

这适用于我的测试,但不适用于我运行 Web 应用程序时。当我运行 Web 应用程序时,我得到:

发生网络相关或特定于实例的错误,同时 建立与 SQL Server 的连接。找不到服务器或 无法访问。验证实例名称是否正确,并且 SQL Server 配置为允许远程连接。 (提供者:SQL 网络接口,错误:26 - 定位服务器/实例时出错 指定)

我在其他一些问题中看到人们建议从连接字符串中删除“用户实例”,但这会导致:

数据库“master”中的 CREATE DATABASE 权限被拒绝。

让我在这里完全清楚我的目标:我正在尝试让 Web 应用程序按需创建数据库实例 (sqlexpress)。

提前创建数据库实例不是解决方案。

当应用程序工作人员访问和创建数据库时,为什么需要某种特殊权限,我对此感到非常困惑。

你怎么能做到这一点?

使用 sqlite 这是一个微不足道的操作,我开始觉得使用 Entity Framework(以及 SQL Server Express)是错误的,我应该使用 fluent nhibernate 和 sqlite 来代替。

【问题讨论】:

您是否使用 IIS 来托管您的 MVC 应用程序?如果是这样,应用程序池使用什么帐户。可能是此帐户的权限问题。 是的。在我的本地 IIS 副本上,我使用的是“ASP.NET v4.0”工作者;显然,这并没有接近生产,因为它坏了,但我们有一个单独的工作人员来处理产品上的应用程序。 【参考方案1】:

这篇文章http://support.microsoft.com/kb/2002980建议是“ASP.Net V4.0”应用池默认账号“ApplicationPoolIdentity”的文件权限问题,建议改成使用“网络服务”。

【讨论】:

不幸的是,这似乎没有帮助。更改为使用“NetworkService”身份,运行 iisreset,但我仍然看到:“数据库 'master' 中的 CREATE DATABASE 权限被拒绝。” 我收回之前的评论;重新启动机器后,这确实修复了它! iisreset 本身是不够的;可能还涉及到一些关于重启 sql server 的问题,但完全重启修复了它。

以上是关于如何在 C# MVC 应用程序中在运行时创建 SQL Server Express 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中在运行时创建 pdf 文件 [关闭]

C# MVC开发中在使用ADO.NET数据模型时出现的问题

在 C# 中在运行时挂钩托管方法

如何在 Android M 或更高版本中在运行时更改权限时防止重新创建 Activity

C#,MVC3,如何将非泛型 DBSet 与运行时定义的类型一起使用?

如何在 C# 中在定义的时间段内保持整个进程执行,包括所有正在运行的线程