Jad*_*ded 9 .net c# database entity-framework-5 postgresql-9.2
我试图让EF 5.0代码首先使用PostgreSQL(Npgsql提供程序).我通过NuGet安装了Npgsql 2.0.12.1(虽然引用的程序集是2.0.12.0).我在app.config中声明了Npgsql(默认连接工厂和提供者工厂):
<entityFramework>
<defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" />
</entityFramework>
<system.data>
<DbProviderFactories>
<add name="Npgsql Data Provider"
invariant="Npgsql"
description="Data Provider for PostgreSQL"
support="FF"
type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/>
</DbProviderFactories>
</system.data>
Run Code Online (Sandbox Code Playgroud)
我有以下测试成功运行:
[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");
}
Run Code Online (Sandbox Code Playgroud)
这意味着至少数据库实例正在运行且提供程序已成功配置.现在我想要的是使用从DbContext继承的自定义数据库上下文,它将绑定到同一个提供程序并通过连接字符串初始化:
public class InventoryContext : DbContext
{
public InventoryContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
// mappings and properties, cut for conciseness
}
Run Code Online (Sandbox Code Playgroud)
以下测试失败:
[Test]
public void DatabaseConnection_DatabaseContextTest()
{
using (var ctx = new InventoryContext(_connectionString))
{
//var db = ctx.Database;
ctx.InventoryObjects.Add(_inventoryObject); // exception here
ctx.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
它说
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.
Run Code Online (Sandbox Code Playgroud)
内部异常是InvalidOperationException:
{"Constructor for type \"Npgsql.NpgsqlFactory\" is not found."}
Run Code Online (Sandbox Code Playgroud)
我猜连接字符串有问题(它不包含Npgsql提供程序):
"Server=127.0.0.1;Port=5432;User Id=postgres;Password=p4ssw0rd;Database=InventoryDatabase;";
Run Code Online (Sandbox Code Playgroud)
以编程方式解决此问题的最优雅方法是什么?刚尝试将connectionString从app.config传递给context的构造函数,它可以工作.
编辑
上传的测试项目到Dropbox - VS2012解决方案,10 MB
深入挖掘问题,发现它是由Npgsql引用EntityFramework 4.4.0程序集的事实引起的.解决如下:
通过在NpgsqlFactory上实现IDbConnectionFactory接口修复了以下错误"无法将NpgsqlFactory强制转换为IDbConnectionFactory":
使用System.Data.Entity.Infrastructure;
...
公共密封类NpgsqlFactory:DbProviderFactory,IServiceProvider的,IDbConnectionFactory
......
公众的DbConnection创建连接(字符串nameOrConnectionString)
{
返回新NpgsqlConnection(nameOrConnectionString);
}
d
现在我遇到了与EF有关的"错误:3F000:架构"dbo"不存在".我必须映射到PostgreSQL标准的公共架构中的DbContext的OnModelCreating:modelBuilder.Entity()ToTable( "表名", "公共")虽然.期待解决这个问题.