Entity Framework 6 以编程方式连接到 Postgres
Entity Framework 6 Programmatically Connect to Postgres
我正在使用 Entity Framework 6 以编程方式建立与 PostgresSQL 的连接。我有这个 class:
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 答案,我在一个 class 库中工作,它忽略了 app.config(请参阅对此 question 的已接受答案的评论)。该程序必须保持这种方式,因为它被用作插件 - 它本身不会(也不应该)运行。提前致谢。
你看过Code-Based Configuration了吗?在与 DbContext
相同的程序集中创建一个带有 public 无参数构造函数的 DbConfiguration
class
class MyConfiguration : System.Data.Entity.DbConfiguration
{
public MyConfiguration()
{
SetProviderServices("Npgsql", Npgsql.NpgsqlServices.Instance);
SetProviderFactory("Npgsql", Npgsql.NpgsqlFactory.Instance);
}
}
现在我认为 DbContext
应该默认使用该提供程序工厂,您可以仅使用连接字符串构造 DbContext
。但是如果它在不同的程序集中,那么您需要做更多的工作,但是可以在上面的 link 中找到。
上述解决方案的一个潜在问题是配置文件中的任何配置都将优先,因此使用 here:[=22 中描述的选项可能更安全=]
var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection();
conn.ConnectionString = "MY_CONN_STR";
new DbContext(conn, true);
您的提供者所在 "Npgsql"
,已在上述 RegisterDbProvider
中注册。
另见 https://msdn.microsoft.com/en-us/library/dd0w4a2z(v=vs.110).aspx
好的,这是我验证有效的适用于您的示例。
使用虚拟代码优先 EF 6 模型 + 自定义 DbConfiguration class:
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());
}
}
然后,代替您的 buildConnectionString(),只需在构造函数中传递 postgre 连接字符串:
using (var ctx = new SchoolContext("host=192.168.168.40;port=5432;...")) {
Console.WriteLine(ctx.Enrollments.ToArray());
}
仅此而已。配置文件在此期间完全为空,并且可以正常工作。
我正在使用 Entity Framework 6 以编程方式建立与 PostgresSQL 的连接。我有这个 class:
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 答案,我在一个 class 库中工作,它忽略了 app.config(请参阅对此 question 的已接受答案的评论)。该程序必须保持这种方式,因为它被用作插件 - 它本身不会(也不应该)运行。提前致谢。
你看过Code-Based Configuration了吗?在与
相同的程序集中创建一个带有 public 无参数构造函数的DbContext
DbConfiguration
classclass MyConfiguration : System.Data.Entity.DbConfiguration { public MyConfiguration() { SetProviderServices("Npgsql", Npgsql.NpgsqlServices.Instance); SetProviderFactory("Npgsql", Npgsql.NpgsqlFactory.Instance); } }
现在我认为
DbContext
应该默认使用该提供程序工厂,您可以仅使用连接字符串构造DbContext
。但是如果它在不同的程序集中,那么您需要做更多的工作,但是可以在上面的 link 中找到。上述解决方案的一个潜在问题是配置文件中的任何配置都将优先,因此使用 here:[=22 中描述的选项可能更安全=]
var conn = DbProviderFactories.GetFactory("MY_CONN_PROVIDER").CreateConnection(); conn.ConnectionString = "MY_CONN_STR"; new DbContext(conn, true);
您的提供者所在
"Npgsql"
,已在上述RegisterDbProvider
中注册。另见 https://msdn.microsoft.com/en-us/library/dd0w4a2z(v=vs.110).aspx
好的,这是我验证有效的适用于您的示例。 使用虚拟代码优先 EF 6 模型 + 自定义 DbConfiguration class:
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());
}
}
然后,代替您的 buildConnectionString(),只需在构造函数中传递 postgre 连接字符串:
using (var ctx = new SchoolContext("host=192.168.168.40;port=5432;...")) {
Console.WriteLine(ctx.Enrollments.ToArray());
}
仅此而已。配置文件在此期间完全为空,并且可以正常工作。