实体框架6以编程方式连接到Postgres

Nic*_*ert 9 entity-framework connection-string database-connection npgsql entity-framework-6

我正在使用Entity Framework 6以编程方式建立与PostgresSQL的连接.我有这个类:

public class ClearspanDatabaseContext : DbContext
Run Code Online (Sandbox Code Playgroud)

使用此构造函数:

public ClearspanDatabaseContext()
    : base(buildConnectionString())
{
}
Run Code Online (Sandbox Code Playgroud)

这是以编程方式创建连接字符串的静态方法:

private static string buildConnectionString()
{
    RegisterDbProvider("Npgsql", ".Net Framework Data Provider for Postgresql", "Npgsql Data Provider", "Npgsql.NpgsqlFactory, Npgsql");
    EntityConnectionStringBuilder entityConnectionStringBuilder = new EntityConnectionStringBuilder();
    entityConnectionStringBuilder.Provider = "Npgsql";
    entityConnectionStringBuilder.ProviderConnectionString = "host=192.168.168.140;Port=5432;username=ClearspanDevLogin;password=*******;database=ClearspanWebServerDev";
    return entityConnectionStringBuilder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

这里是将Npgsql注册为数据库提供程序的方法,取自此:

public static bool RegisterDbProvider(string invariant, string description, string name, string type)
{
    try
    {
        DataSet ds = ConfigurationManager.GetSection("system.data") as DataSet;
        foreach (DataRow row in ds.Tables[0].Rows)
        {
            if (row["InvariantName"].ToString() == invariant)
            {
                return true;
            }
        }
        ds.Tables[0].Rows.Add(name, description, invariant, type);
        return true;
    }
    catch
    {
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这会生成如下字符串:

"provider=Npgsql;provider connection string=\"host=192.168.168.140;Port=5432;username=ClearspanDevLogin;password=********;database=ClearspanWebServerDev\""
Run Code Online (Sandbox Code Playgroud)

但我得到一个ArgumentException:

不支持关键字:'provider'.

我认为我接近程序化连接,但我错过了一些小事.如何解决此异常并以编程方式正确设置此连接?没有app.config回答,我正在一个类库中,它忽略了app.config(参见这个问题的接受答案的评论).这个程序必须保持这种方式,因为它被用作插件 - 它本身不运行(也不应该).提前致谢.

Evk*_*Evk 10

好的,这是我验证的工作示例.使用伪代码优先EF 6模型+自定义DbConfiguration类:

public class Enrollment {
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
}

[DbConfigurationType(typeof (NpgsqlConfiguration))]
public class SchoolContext : DbContext {
    public SchoolContext(string cs) : base(cs) {
    }

    public DbSet<Enrollment> Enrollments { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {

    }
}

class NpgsqlConfiguration : System.Data.Entity.DbConfiguration
{
    public NpgsqlConfiguration()
    {
        SetProviderServices("Npgsql", Npgsql.NpgsqlServices.Instance);
        SetProviderFactory("Npgsql", Npgsql.NpgsqlFactory.Instance);
        SetDefaultConnectionFactory(new Npgsql.NpgsqlConnectionFactory());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,只需在构造函数中传递postgre连接字符串,而不是buildConnectionString():

using (var ctx = new SchoolContext("host=192.168.168.40;port=5432;...")) {                
            Console.WriteLine(ctx.Enrollments.ToArray());
        } 
Run Code Online (Sandbox Code Playgroud)

这就是全部.在此期间,配置文件完全为空,并且它可以正常工作.