无法连接到 LocalDB

12
我正在尝试运行一个基于IIS的应用程序(以电影数据库的形式),以便自学如何设计三层架构程序:MVC应用程序、WCF服务和SQL Server数据库。由于我没有完整SQL Server的许可证密钥,我决定使用LocalDB,并有WCF服务包装我的存储过程。这是我第一次使用LocalDB,遇到了连接到我的实例v13.0的问题。 我的问题: 我无法使VS中的项目连接到LocalDB实例。我一直收到以下错误信息:
“在建立与SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问。请验证实例名称是否正确并且SQL Server已配置为允许远程连接。(提供程序:SQL Network Interfaces,错误:50 - 发生了本地数据库运行时错误。指定的LocalDB实例不存在。”
我的连接字符串(来自Web.config):
<connectionStrings>
    <add name="MovieDB" connectionString="Data Source=(localdb)\v13.0;Initial Catalog=MovieDB;Integrated Security=True;AttachDbFilename=|DataDirectory|\MovieDB.mdf" />
</connectionStrings>

使用sqlcmd连接并运行查询没有问题:

Connecting to LocalDB instance just fine from command line

Visual Studio SQL Server对象资源管理器可以正常连接:

Visual SQL Server Object Explorer can connect just fine

连接字符串是由 Visual Studio 转义后传递到有问题的行,因此我知道连接字符串没有被错误转义:
"Data Source=(localdb)\\v13.0;Initial Catalog=MovieDB;Integrated Security=True;AttachDbFilename=|DataDirectory|\\MovieDB.mdf"

我尝试按照此指南(第一部分第二部分)操作,但至少在2016年4月18日之后,图片已经无法显示,因此我无法完全理解应该如何操作。我只能得到上述错误,因为我把应用程序池标识更改为LocalSystem:

I was only able to get this error because I changed the app pool identity to LocalSystem

当应用程序池运行在ApplicationPoolIdentity标识下时,我会收到以下错误信息:
“在建立与SQL Server的连接时发生了与网络相关或特定于实例的错误。未找到服务器或无法访问服务器。请验证实例名称是否正确,并且已配置SQL Server以允许远程连接。(提供程序:SQL Network Interfaces,错误:50 - 本地数据库运行时错误发生。无法获取本地应用程序数据路径。很可能未加载用户配置文件。如果LocalDB在IIS下执行,请确保为当前用户启用了配置文件加载。”
我甚至修改了C:\windows\system32\inetsrv\config\applicationHost.config文件以强制加载配置文件,但仍然没有解决问题。
<applicationPools>
    <add name="DefaultAppPool" />
    <add name="Classic .NET AppPool" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" />
    <add name=".NET v2.0 Classic" managedRuntimeVersion="v2.0" managedPipelineMode="Classic" />
    <add name=".NET v2.0" managedRuntimeVersion="v2.0" />
    <add name=".NET v4.5 Classic" managedRuntimeVersion="v4.0" managedPipelineMode="Classic" />
    <add name=".NET v4.5" managedRuntimeVersion="v4.0">
        <!-- I added this, before it was an empty node -->
        <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="true" />
    </add>
    <applicationPoolDefaults managedRuntimeVersion="v4.0">
        <!-- This was already here -->
        <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="false" />
    </applicationPoolDefaults>
</applicationPools>

我的应用程序正在.NET 4.5应用程序池下运行

My app is running under the ".NET 4.5" app pool

我的代码:

页面加载并调用此服务以获取数据库中电影列表:

[ServiceContract]
public interface IMovieDBService
{
    // ...

    [OperationContract]
    List<Movie> GetMovies(int actorID);

    // ...
}

public class MovieDBService : IMovieDBService
{
    // ...

    public List<Movie> GetMovies(int actorID = 0)
    {
        var output = new List<Movie>();
        using (var connection = DBTools.GetConnection(MovieDBConnectionName)) // Does not get past here; MovieDBConnection = "MovieDB"
        {
            var parameters = new List<SqlParameter>
            {
                new SqlParameter("@actorID", actorID)
            };

            using (var reader = connection.ExecuteStoredProcedure("GetMovies", parameters))
            {
                while (reader.Read())
                {
                    output.Add(new Movie
                    {
                        ID = reader.GetInt32("ID"),
                        Title = reader.GetString("Title"),
                        Year = reader.GetInt16("Year"),
                        Genre = GetGenre(reader.GetInt32("GenreID"))
                    });
                }
            }
        }

        return output;
    }

    // ...
}

我DBTools项目中的有问题的方法:

public static SqlConnection GetConnection(string connectionName)
    {
        var connection = new SqlConnection();
        var connectionString = ConfigurationManager.ConnectionStrings[connectionName];
        if (connectionString != null)
        {
            connection.ConnectionString = connectionString.ConnectionString;
            connection.Open(); // breaks here

            return connection;
        }

        return null;
    }

我只能假设问题与身份验证有关,或者是因为托管在IIS上的应用程序正试图连接到LocalDB用户进程,但我已经尝试按照其他问题的说明进行操作,但未成功(可能是因为未能理解真正的问题)。我感到非常困惑...


LocalDB是用于开发的,且仅适用于尝试运行它的用户。在ASP.NET环境中,您最好切换到SQL Express。 - D Stanley
@Chris Bowe 嗨 Chris。我遇到了同样的错误。不知道你是怎么解决的? - Varun Pozhath
1
我最终放弃了尝试使用LocalDB。我只是在本地使用SQL Server,创建一个新的数据库,并让EF在新站点的第一次注册时创建用户表。 - IrishChieftain
3个回答

3
尝试以下操作:在您的应用程序host文件中将processModel identityType更改为SpecificUser,并包括用户名和密码。或者将您的应用程序池身份更改为具有数据库访问权限的用户。基于您的截图,当您作为应用程序池身份运行时,您正在以预定义的本地帐户本地系统运行,而sqlcmd正在以您登录的用户身份运行。

1
我不得不将我的更改为“LocalSystem”。 - Vasily Hall

2
问题在于您的IIS应用程序池帐户无法看到localdb实例,因为只有创建该实例的帐户可以访问它,这很可能是您的个人用户帐户。您可以通过运行此命令与计算机上的其他用户(例如IIS应用程序池帐户)共享它:
sqllocaldb share v13.0 v13.0_shared

我们分享了 v13.0 实例并将共享实例命名为 v13.0_shared。然后,您需要将连接字符串中的 Data Source 部分更改为以下内容:
Data Source=(localdb)\.\v13.0_shared

请注意实例名称前面的.\。这表示您正在尝试连接到共享实例。
现在,所有的IIS应用程序池都可以连接到localdb实例,而无需为每个应用程序池配置权限。

0

你有检查过 web.config 文件中的 entityFramework 标签吗? enter image description here

参数值应该是你的实例名称。 连接到本地数据库实例的示例:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接