Entity Framework 5.0 PostgreSQL(Npgsql)默认连接工厂

我试图让EF 5.0代码首先使用PostgreSQL(Npgsql提供程序)。 我通过NuGet安装了Npgsql 2.0.12.1(但引用的程序集是2.0.12.0)。 我在app.config中声明了Npgsql(默认连接工厂和提供者工厂):

        

我有以下测试成功运行:

 [Test] public void DatabaseConnection_DatabaseFactoryTest() { var factory = DbProviderFactories.GetFactory("Npgsql"); var conn = factory.CreateConnection(); conn.ConnectionString = _connectionString; var npg = (NpgsqlConnection)conn; var result = TestConnectionHelper(npg); // scalar select version(), nothing particular Assert.AreEqual(result, "PostgreSQL 9.2.2, compiled by Visual C++ build 1600, 64-bit"); } 

这意味着至少数据库实例正在运行且提供程序已成功配置。 现在我想要的是使用从DbContextinheritance的自定义数据库上下文,它将绑定到同一个提供程序并通过连接字符串初始化:

 public class InventoryContext : DbContext { public InventoryContext(string nameOrConnectionString) : base(nameOrConnectionString) { } // mappings and properties, cut for conciseness } 

以下测试失败:

 [Test] public void DatabaseConnection_DatabaseContextTest() { using (var ctx = new InventoryContext(_connectionString)) { //var db = ctx.Database; ctx.InventoryObjects.Add(_inventoryObject); // exception here ctx.SaveChanges(); } } 

它说

 Failed to set Database.DefaultConnectionFactory to an instance of the 'Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7' type as specified in the application configuration. See inner exception for details. 

内部exception是InvalidOperationException:

 {"Constructor for type \"Npgsql.NpgsqlFactory\" is not found."} 

我猜连接字符串有问题(它不包含Npgsql提供程序):

 "Server=127.0.0.1;Port=5432;User Id=postgres;Password=p4ssw0rd;Database=InventoryDatabase;"; 

以编程方式解决此问题的最优雅方法是什么? 刚尝试将connectionString从app.config传递给上下文的构造函数,它可以工作。
编辑
将测试项目上传到Dropbox – VS2012解决方案,10 MB

深入挖掘问题,发现它是由Npgsql引用EntityFramework 4.4.0程序集的事实引起的。 解决如下:

  1. 为测试项目添加了EF Nuget包(它是针对FW 4.5构建的);
  2. 在Npgsql2010项目中手动添加对EntityFramework.dll版本5的引用(Nuget默认添加4.4.0);
  3. 将Npgsql app.config中的程序集绑定更改为“EntityFramework,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089” ;
  4. 修复了上面描述的“构造函数类型”Npgsql.NpgsqlFactory“通过使构造函数公开未找到错误;
  5. 通过在NpgsqlFactory上实现IDbConnectionFactory接口修复了以下错误“无法将NpgsqlFactory强制转换为IDbConnectionFactory”

    使用System.Data.Entity.Infrastructure;

    public sealed class Np​​gsqlFactory:DbProviderFactory,IServiceProvider,IDbConnectionFactory

    public DbConnection CreateConnection(string nameOrConnectionString)
    {
    返回新的NpgsqlConnection(nameOrConnectionString);
    }
    d

现在我遇到了与EF有关的“错误:3F000:架构”dbo“不存在”。 我在DbContext的OnModelCreating:modelBuilder.Entity()。ToTable(“TableName”,“public”)中映射到PostgreSQL标准公共模式。 期待解决这个问题。