获取实体框架连接字符串
Posted
技术标签:
【中文标题】获取实体框架连接字符串【英文标题】:Get the Entity Framework Connection String 【发布时间】:2012-10-11 19:29:33 【问题描述】:我们使用 Entity Framework 5,但还需要使用来自应用程序的普通数据库连接来执行我们需要执行的一些自定义 SQL。
所以,我正在创建一个处理此连接的 DatabaseAccess 类。有没有办法通过检查实体框架连接字符串来填充连接字符串?
所以:
SqlConnection cnn;
connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password"
我可以通过检查实体框架来构建它吗?
【问题讨论】:
您是先使用代码还是使用 edmx 文件?你用的是 DbContext 的 ObjectContext 吗? 下面的大多数答案都回答了错误的问题——当答案是“通过检查实体框架连接字符串”而不是上下文实例时,他们建议从实例化上下文中获取连接。本质上,您不需要实例化整个 EF 上下文机制来获取一条字符串。您只需要来自被低估的答案之一的 EntityConnectionStringBuilder 【参考方案1】:您的意思是,您可以在 EF DbContext 中使用 SqlConnection 吗?
DbContext 类有一个constructor,你可以在其中传入一个SqlConnection,然后告诉EF 它是否拥有它。
var YourContext = new YourContext(SqlConnection, true);
【讨论】:
假设它是一个 DbContext,对于大多数使用 VS2010 或 2008 的人来说,这不是默认设置。ObjectContext 没有这样的构造函数。 这个答案建议实例化整个 EF 上下文只是为了从 EF 连接字符串中获取一段字符串。甚至不考虑它是 IDisposable...【参考方案2】:您可以通过以下方式获取 EF 使用的连接字符串:
MyDbContext.Database.Connection.ConnectionString
或者正如马克所说,您可以使用 sqlconnection 初始化上下文
【讨论】:
这将显示 EF 连接字符串,当使用 edmx 文件时,标准 SqlConnection 无法使用该字符串。 这也不是真的。您可以将 DbContext 与 edmx 文件一起使用,并且在使用此方法时,您仍然会有一个 EntityConnection 字符串而不是 Database ConnectionString。 你似乎没有理解我的意思。如果您使用 DbContext 和 edmx 文件,那么您提到的 ConnectionString 属性将 NOT 包含与 SqlConnection 兼容的连接字符串。它将有一个 EntityConnection 字符串,其中包括元数据字符串等等。所以不,你的方法,如果使用 DbContext 和 edmx 文件将不允许某人获取连接字符串并将其与 SqlConnection 一起使用。 感谢@luke-mcgregor 的建议。它终于是我为我的问题找到的唯一可行的解决方案。实体框架的连接字符串是非标准的,但是使用这个属性,它会返回一个良好且格式化的连接字符串,我可以与 SqlConnection 或 OracleConnection 一起使用。 它不会带密码。【参考方案3】:是的,你可以。
请参阅here 了解 3 个选项。
1 - 为每个使用单独的连接字符串
2 - 从你的实体对象中提取它(这是我认为你想要的)
3 - 使用实体对象执行您的自定义 SQL
这里是如何做nr 2:
using System.Data.EntityClient;
using System.Data.SqlClient;
...
private string GetADOConnectionString()
SalesSyncEntities ctx = new SalesSyncEntities(); //create your entity object here
EntityConnection ec = (EntityConnection)ctx.Connection;
SqlConnection sc = (SqlConnection)ec.StoreConnection; //get the SQLConnection that your entity object would use
string adoConnStr = sc.ConnectionString;
return adoConnStr;
【讨论】:
你不能只使用ctx.Connection.ConnectionString
吗?
@Wimpie Ratte,这太完美了。它给出了准确的连接字符串。 PS:EntityConnection 位于 System.Data.EntityClient 命名空间下。【参考方案4】:
这是获取连接字符串的通用方法:
public string GetConnString<T>(T ent)
where T : ObjectContext
EntityConnection ec = (EntityConnection)ent.Connection;
SqlConnection sc = (SqlConnection)ec.StoreConnection;
return sc.ConnectionString;
那么使用它是:
MyEntities ent = new MyEntities();
String ConnString = GetConnString(ent);
【讨论】:
【参考方案5】:即使在 EF3 中,您也可以使用 EntityConnectionStringBuilder。
EntityConnectionStringBuilder conn =
new EntityConnectionStringBuilder(DBEntities.dbConnection);
SqlConnection s = new SqlConnection(conn.ProviderConnectionString);
【讨论】:
我使用了这个,但是从 web.config 而不是 DBEntities.dbConnection 中读取了 ef 字符串。非常感谢【参考方案6】:以下是在 EF 5、EF 6 和 EF Core 1/EF 7 中获取连接字符串的方法。
//Entity Framework 5
myContext.Database.Connection.ConnectionString
//Entity Framework 6
myContext.Database.Connection.ConnectionString
//Entity Framework Core 1
myContext.Database.GetDbConnection().ConnectionString
更多详情请看-http://nodogmablog.bryanhogan.net/2016/04/entity-framework-checking-the-connection-string-of-your-context/
【讨论】:
【参考方案7】:我也遇到了这个问题,你可以这样做:
SqlConnection con = context.Database.Connection as SqlConnection;
SqlCommand command = new SqlCommand(sql, con);
con.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.HasRows)
while (reader.Read())
//read your fields
reader.NextResult();
con.Close();
【讨论】:
精华就在第一行——喜欢!【参考方案8】:希望对你有帮助..
private readonly ApplicationDbContext _applicationDbContext;
string connectionString = string.Empty;
public CommonService(ApplicationDbContext applicationDbContext)
_applicationDbContext = applicationDbContext;
connectionString = _applicationDbContext.Database.GetDbConnection().ConnectionString;
【讨论】:
请查看其他答案,已经有解决 OP 问题的有效解决方案。 :-)【参考方案9】://实体框架5
myContext.Database.Connection.ConnectionString
//实体框架6
myContext.Database.Connection.ConnectionString
//实体框架核心1
myContext.Database.GetDbConnection().ConnectionString
【讨论】:
【参考方案10】:在我的例子中,我只需要执行一个更新语句,所以我使用了以下构造
_db.Database.ExecuteSqlCommand($"update ChiusureTurni set esportato = 1 where idChiusuraTurni = idChiusura");
其中 _db 是我的数据库上下文,在这种情况下,我利用了事务管理
【讨论】:
以上是关于获取实体框架连接字符串的主要内容,如果未能解决你的问题,请参考以下文章
提供者未返回 ProviderManifestToken 字符串实体框架