我在使用 SqlLocalDB 和 SqlExpress 时遇到了这个问题。
问题的原因:
当我从 Visual Studio 连接到 localdb 时,会为其启动一个 LocalDB 实例并作为我们的 Windows 帐户运行。但是,当在 IIS 中作为“网络服务”或“AppPoolIdentity”运行的 Web 应用程序连接到 LocalDB 时,会为其启动另一个 LocalDB 实例并作为“网络服务”或“AppPoolIdentity”运行。因此,即使 Visual Studio 和 Web 应用程序都使用相同的 LocalDB 连接字符串,它们也会连接到不同的 LocalDB 实例。显然,在我们的 LocalDB 实例上从 Visual Studio 创建的数据库在 Web 应用程序的 LocalDB 实例中将不可用。
解决方案:
所以,在这里我列出了两种情况的解决方案(即)SqlExpress 和 LocalDB
如果我们使用 LocalDB 作为数据源:
- 将应用程序池标识设置为“网络服务”
- 更新applicationHost.config文件以包含以下突出显示的设置:
<processModel identityType="NetworkService" loadUserProfile="true" setProfileEnvironment="true" />
- 通过在管理员模式下在 CMD.exe 中运行以下命令将 SqlLocalDB 更改为共享实例
SqlLocalDB.exe share "MyLocalDB" "MySharedLocalDB"
(这里“MyLocalDB”是我的本地数据库实例。您可以通过在管理员模式SqlLocalDB.exe中的 CMD.exe 中执行以下命令来找到相同的
)因此,我的连接字符串如下: <add name="DefaultConnection" connectionString= "数据源=(localdb)\.\MySharedLocalDB ;AttachDbFilename=|DataDirectory|\aspnet-DemoSite-20200716010415.mdf;初始目录=aspnet-DemoSite-20200716010415;用户ID=sa;密码=welcome123;用户实例=false ”
- 由于我在 IIS 中托管应用程序,因此我确保帐户“NT AUTHORITY\NETWORK SERVICE”具有对应用程序根文件夹的读/写访问权限以避免“访问被拒绝”异常,并启用该帐户作为系统管理员通过执行访问 SqlInstance下面的 SQL 查询
exec sp_addsrvrolemember 'NT AUTHORITY\NETWORK SERVICE', sysadmin
如果我们使用 SqlExpress 作为数据源:
1.确保连接字符串具有正确的值,如下所示: <add name="DefaultConnection" connectionString=" Data Source=.\SQLEXPRESS ;AttachDbFilename=|DataDirectory|\aspnet-DemoSite-20200716010415.mdf;Initial Catalog=aspnet- DemoSite-20200716010415;User ID=sa;Password=welcome123;User Instance=false" 2.如上图所示,删除位于 C:\Users<userName>\AppData\Local\Microsoft\Microsoft SQL Server Data\ 中的旧文件SQLEXPRESS