gpt4 book ai didi

entity-framework - Entity Framework 6 以编程方式连接到 Postgres

转载 作者:行者123 更新时间:2023-12-01 20:26:55 26 4
gpt4 key购买 nike

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

public class ClearspanDatabaseContext : DbContext

使用这个构造函数:

public ClearspanDatabaseContext()
: base(buildConnectionString())
{
}

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

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();
}

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

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;
}

这会生成一个像这样的字符串:

"provider=Npgsql;provider connection string=\"host=192.168.168.140;Port=5432;username=ClearspanDevLogin;password=********;database=ClearspanWebServerDev\""

但是我得到一个ArgumentException:

Keyword not supported: 'provider'.

我认为我已经接近程序化连接,但缺少一些小东西。我该如何解决此异常并以编程方式正确设置此连接?没有 app.config 答案,我正在一个类库中工作,它忽略了 app.config (请参阅对此 question 的接受答案的评论)。该程序必须保持这种方式,因为它被用作插件 - 它不会(也不应该)单独运行。提前致谢。

最佳答案

好的,这是我验证过的工作示例。使用虚拟代码优先 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());
}
}

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

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

仅此而已。在此期间配置文件完全是空的,并且它可以工作。

关于entity-framework - Entity Framework 6 以编程方式连接到 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32387487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com