c# - 无法确定类型为 'Npgsql.NpgsqlFactory' 的提供程序工厂的提供程序名称

标签 c# asp.net-mvc postgresql unit-testing npgsql

我尝试运行一个测试项目,但没有成功,因为 npgsql 连接失败。我重新安装了 Npgsql、Npgsql.EntityFramework、EntityFramwork...但问题仍然存在。 结果信息:

Método de teste TestUserControl.ControleBaseTest.TesteGetPermissoesUsuarioFixo gerou exceção:

System.NotSupportedException: Unable to determine the provider name for provider factory of type 'Npgsql.NpgsqlFactory'. Make sure that the ADO.NET provider is installed or registered in the application config. Result StackTrace:

我有这个 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>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SqlClient"     type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="Npgsql" type="Npgsql.NpgsqlServices, Npgsql.EntityFramework">    </provider>
    </providers>
    <!--<defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql" />-->
    <defaultConnectionFactory type="Npgsql.NpgsqlConnectionFactory, Npgsql" />
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Npgsql" />
      <add name="Npgsql Data Provider" invariant="Npgsql" support="FF" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
    </DbProviderFactories>
  </system.data>
</configuration>

DbConfig 是...

public class CtxUser : DbContext
{
    public CtxUser(string conexao) : base(conexao) { }
    public CtxUser(DbConnection conexao) : base(conexao, true) { }
}

我的模型...

[Serializable]
[Table("mytable", Schema = "public")]
public class Users
{
    [Key, Column("userid")]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    [Column("login")]
    public string Login { get; set; }

    [Column("password")] 
    public string Password { get; set; }
}

我的逻辑类...

private DbConnection Conexao { get; set; }
public ControleBase(DbConnection connector)
{
    if(conexao == null)
        throw new ArgumentException("blah blah", "connector");
    Conexao = conexao;
}

public Usuarios GetUser(int id)
{
    if(id <= 0)
        throw new ArgumentException("blah blah");
    Users user;
    using (var ctx  = new CtxUser(Connection))
    {
        user = ctx.DbUser.Find(id);
    }
    return user;
}

我的测试方法...

[TestClass]
public class ControleBaseTest
{
    private DbConnection Conexao
    {
        get
        {
            var cnxBuilder = new NpgsqlConnectionStringBuilder
            {
                Database = "mydatabase",
                Host = "localhost",
                Port = 5432,
                UserName = "postgres",
                Password = "postgres",
                Enlist = true,
                CommandTimeout = 30,
                Timeout = 30,
                Pooling = true,
                MinPoolSize = 1,
                MaxPoolSize = 20,
                Compatible = new Version(2, 1),
                PreloadReader = true
            };
            return new NpgsqlConnection(cnxBuilder);
        }
    }
    
    [TestMethod]
    public void TestGetUser()
    {
        IUserControl userControl = new ControleBase(Conexao);            
        var usuario = userControl.GetUsuario(9);
        Assert.IsNotNull(usuario);
    }
}

很明显,这个测试只是为了测试与Npgsql和linq等的连接...测试问题的解决方案。有人有想法吗?

最佳答案

我遇到了同样的问题并通过将 Npgsql.dll 设置为在本地复制来修复它 引用属性。出于某种原因,VS 2013(也许还有其他版本)将此变为 在看似随机的时间点“假”。这导致构建它不 将 .dll 复制到导致上述错误的编译目录。

希望对您有所帮助,但对您来说可能有所不同。

关于c# - 无法确定类型为 'Npgsql.NpgsqlFactory' 的提供程序工厂的提供程序名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26184799/

相关文章:

c# - 如何创建具有 EntityState 未知关系的对象

c# - 将变量从 Controller 传递到 Devexpress GridView 列 EndCallBack JS

c# - FakeItEasy 不验证完整框架 SignalR 测试的调用

postgresql - 如何在私有(private)云内的特定主机上对 AWS 用户进行身份验证

java - 从 PL/pgSQL 函数返回行

c# - String.Split 方法未按预期工作

c# - 可以在本地连接到 Salesforce 连接的应用程序,但在 Azure 函数中发布时无法连接

c# - 记录 lambda 表达式

asp.net-mvc - ASP.NET MVC 5 OWIN 区域认证

node.js - SequelizeDatabaseError : column "id_strain" of relation "strain" is already an identity column