Tôi đang cố gắng để có được mã EF 5.0 đầu tiên làm việc với PostgreSQL (nhà cung cấp Npgsql). Tôi có Npgsql 2.0.12.1 cài đặt thông qua NuGet (tham chiếu lắp ráp là 2.0.12.0 mặc dù). Tôi có Npgsql khai báo trong app.config (cả hai nhà máy kết nối mặc định và nhà máy cung cấp): thử nghiệmEntity Framework 5.0 Nhà máy kết nối mặc định PostgreSQL (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>
Tôi đã sau chạy thành công:
[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");
}
Điều đó có nghĩa ít nhất cơ sở dữ liệu ví dụ đang chạy và nhà cung cấp được định cấu hình thành công. Bây giờ những gì tôi muốn là sử dụng bối cảnh cơ sở dữ liệu tùy chỉnh được thừa kế từ DbContext đó sẽ được gắn với cùng một nhà cung cấp và khởi tạo thông qua chuỗi kết nối:
public class InventoryContext : DbContext
{
public InventoryContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
// mappings and properties, cut for conciseness
}
thử nghiệm sau thất bại:
[Test]
public void DatabaseConnection_DatabaseContextTest()
{
using (var ctx = new InventoryContext(_connectionString))
{
//var db = ctx.Database;
ctx.InventoryObjects.Add(_inventoryObject); // exception here
ctx.SaveChanges();
}
}
Nó nói
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.
Ngoại lệ bên trong là InvalidOperationException:
{"Constructor for type \"Npgsql.NpgsqlFactory\" is not found."}
Tôi đoán có một vấn đề với chuỗi kết nối (nó không chứa cung cấp Npgsql):
"Server=127.0.0.1;Port=5432;User Id=postgres;Password=p4ssw0rd;Database=InventoryDatabase;";
cách thanh lịch nhất để giải quyết vấn đề này theo chương trình là gì? Chỉ cần cố gắng đi qua connectionString từ app.config đến constructor của context, nó hoạt động.
chỉnh sửa
Tải Lên thử nghiệm dự án để Dropbox - VS2012 solution, 10 mb
Xin chào! Điều này .1 cuối cùng trong gói nuget là vì tôi không thể cập nhật gói 2.0.12. Có một tệp bị thiếu trong gói và tôi phải cập nhật nó. Nhưng hãy yên tâm rằng nhị phân Npgsql giống như phiên bản 2.0.12. :) Bạn có nhớ gửi cho tôi dự án mẫu này để tôi có thể xem nó không? Tôi nghĩ rằng đây có thể là một lỗi trong Npgsql mà có thể thiếu một nhà xây dựng EF đang mong đợi. Email của tôi là francisco tại npgsql dor org. Cảm ơn trước. –
Phiên bản không phải là một vấn đề mặc dù tôi đã mất một số thời gian tìm hiểu lý do tại sao lắp ráp không được tìm thấy trong thời gian chạy. Điểm thực sự là trong cấu hình chuỗi kết nối, đặc biệt là trong thực tế trong môi trường sản xuất của tôi, tôi không thể sử dụng/sửa đổi các tệp .config (ứng dụng WPF XBAP được xuất bản trong các hạn chế IIS). Sẽ gửi cho bạn dự án mẫu trong vài giờ. – Jaded
Dự án mẫu đã gửi, thêm liên kết tải xuống hộp kéo nếu người khác muốn xem. – Jaded