使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

Posted

技术标签:

【中文标题】使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段【英文标题】:SQL Server connection throw exception when using Entity Framework migration - add code snippet 【发布时间】:2016-07-14 01:35:42 【问题描述】:

我有一个简单的 C# 解决方案,它有一个实体类和一个上下文类,还有一个我用来测试实体框架迁移的控制台应用程序。但我总是得到这个错误:

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

这是app.config 中的连接字符串(我把它放在控制台的app.config 和上下文类的app.config 中):

<add name="ZzaDbConnectionString" 
     connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Zza;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite‌​;MultiSubnetFailover=False" 
     providerName="System.Data.SqlClient" />

我从 SQL Server ObjectExplorer 的数据库的“连接字符串”属性中复制了连接字符串,所以我认为它很好。

有什么建议为什么它总是抛出这个异常?

我添加了实体类、上下文类和控制台类,希望这能澄清我的问题。

这是实体类。

namespace Zza.Entities

    public class Customer
    
        public Guid Id  get; set; 

        [MaxLength(50)]
        public string FullName  get; set; 
    

这是上下文类:

namespace Zza.Data

    public class ZzaDbContext : DbContext
    
        public DbSet<Customer> Customers  get; set; 
    

这是控制台类:

namespace TestEFMigration

    public class Program
    
        static void Main(string[] args)
        
            CreateDataBase();
        

        private static void CreateDataBase()
        
            var context = new ZzaDbContext();

            context.Database.Initialize(false);
        
    

控制台的 app.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <connectionStrings>
    <add name="ZzaDbConnectionString" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Zza;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient" />
  </connectionStrings>  
</configuration>

以及上下文类的app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="ZzaDbConnectionString" connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Zza;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

谢谢。

【问题讨论】:

这里是连接字符串: 你的 sql 中有凭据吗? 如果你有一个 .mdf 或 .sdf 文件,你可以把它的名字放在你的连接字符串中,试着用谷歌搜索一些连接字符串可能会解决问题 @Desperado,db 使用 windows 嵌入式身份验证。我需要在连接字符串中放入什么凭据? @Saeid:不。我没有 .mdf 或 .sdf 文件。 【参考方案1】:

我减少了连接字符串。

当您使用 localdb 时,您的某些用于完整 sql server 的参数可能会出现问题(您知道吗?)

我发现的不同之处是:

connectionString="AttachDbFilename=|DataDirectory|\Zza.mdf;MultipleActiveResultSets=True;App=EntityFramework" 
connectionString="Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite‌​;MultiSubnetFailover=False"

所以,请尝试删除第二行的所有选项并在顶部添加选项(AttachDbFilename 可以是您要使用/创建的 mdf 的路径)

<add name="ZzaDbConnectionString" 
 connectionString="Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Zza;Integrated Security=True;
 AttachDbFilename=|DataDirectory|\Zza.mdf;MultipleActiveResultSets=True;App=EntityFramework;"
 providerName="System.Data.SqlClient" />

编辑:检查一下

public class ZzaDbContext: DbContext

  public ZzaDbContext()
        : this("ZzaDbConnectionString") 
    
    
    // ...

【讨论】:

感谢您的建议。我的新发现是我可以使用 -ConnectionStringName 选项运行代码库迁移并将“ZzaDbConnectionString”分配给它并且它可以工作。但是如果我尝试直接运行代码,我仍然会得到同样的异常。 我可以看看您的上下文类声明以及您如何创建实例吗?也许问题与您的 dbcontext 无法识别连接字符串有关 命名空间 Zza.Data public class ZzaDbContext : DbContext public DbSet Customers get;放; 你在哪里实例化它?即,使用 (var db = new ZzaDbContext()) ... 顺便说一句,要使 dbcontext 使用您的连接字符串,它必须具有相同的名称,或者您必须在构造函数上传递名称。请看我编辑的答案。

以上是关于使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段的主要内容,如果未能解决你的问题,请参考以下文章

具有 SQL Server 连接的实体框架 6 尝试使用 MySqlClient 并崩溃

在 Visual Studio 中使用实体框架与 SQL Server 的连接问题

如何更改实体框架项目以使用 Microsoft SQL Server

在实体框架代码优先中,为啥我不能在连接字符串中使用 SQL Server Express?

将实体框架连接字符串转换为 SQL Server Express

如何使用实体框架打开受密码保护的 SQL Server CE 数据库