获取Entity Framework连接字符串

66
我们使用Entity Framework 5,但有一个要求需要通过应用程序使用普通的数据库连接执行一些自定义SQL。因此,我正在创建一个DatabaseAccess类来处理这个连接。是否有一种方法可以通过检查Entity Framework连接字符串来填充连接字符串呢?
所以:
SqlConnection cnn;
connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password"

我可以通过检查Entity Framework来构建它吗?


你是在使用Code First还是edmx文件?你是在使用ObjectContext还是DbContext? - Erik Funkenbusch
大多数下面的答案都回答了错误的问题 - 它们建议从实例化的上下文获取连接,而答案是“通过检查Entity Framework连接字符串”,而不是上下文实例。 你不需要实例化整个EF上下文机器来获取一个字符串片段,本质上。您只需要从其中一个被低估的答案中获取EntityConnectionStringBuilder - amarax
11个回答

113

你可以通过以下方式获取 EF 使用的连接字符串:

MyDbContext.Database.Connection.ConnectionString

正如Mark所说,您可以使用sqlconnection来初始化上下文


这将显示EF连接字符串,当使用edmx文件时,它不能被标准的SqlConnection使用。 - Erik Funkenbusch
这也不是真的。您可以在edmx文件中使用DbContext,而且当使用此方法时,仍会有一个EntityConnection字符串,而不是Database ConnectionString。 - Erik Funkenbusch
5
你似乎没有理解我的观点。如果你正在使用 DbContext 和 edmx 文件,那么你提到的 ConnectionString 属性将不会包含一个适用于 SqlConnection 的连接字符串。它将包含一个 EntityConnection 字符串,其中包括元数据字符串等内容。因此,如果使用 DbContext 和 edmx 文件,则无法使用你的方法获取连接字符串并将其用于 SqlConnection。 - Erik Funkenbusch
1
感谢@luke-mcgregor的建议。这终于是我找到的唯一可行的解决方案。实体框架的连接字符串是非标准的,但使用此属性,它将返回一个良好格式化的连接字符串,我可以将其与SqlConnection或OracleConnection一起使用。 - David
8
无法找回密码。 - Power Star
它回答了错误的问题。它从已实例化的上下文中获取连接字符串,而不是从EF连接字符串中获取。 - amarax

62

19

是的,你可以。

查看这里获取3个选项。

1-为每个使用单独的连接字符串

2-从实体对象中提取它(我认为这是你想要的)

3-使用实体对象执行自定义SQL

以下是如何执行第二步:

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

2
你不能只使用 ctx.Connection.ConnectionString 吗? - cost
@Wimpie Ratte,非常完美。它提供了准确的连接字符串。PS:EntityConnection位于System.Data.EntityClient命名空间下。 - Venugopal M

14

//实体框架 5

myContext.Database.Connection.ConnectionString

//实体框架6

myContext.Database.Connection.ConnectionString

//实体框架核心1

myContext.Database.GetDbConnection().ConnectionString

1
我需要 EF 6:myContext.Database.GetConnectionString()。 - Enkode

11

即使在 EF3 中,您仍然可以使用 EntityConnectionStringBuilder。

EntityConnectionStringBuilder conn = 
    new EntityConnectionStringBuilder(DBEntities.dbConnection);
SqlConnection s = new SqlConnection(conn.ProviderConnectionString);

我使用了这个,但是从web.config中读取ef字符串,而不是DBEntities.dbConnection。非常感谢。 - Tomas Hesse

10

你的意思是,你能在EF DbContext中使用SqlConnection吗?

DbContext类有一个constructor,你可以在其中传递一个SqlConnection,然后告诉EF它是否拥有它。

var YourContext = new YourContext(SqlConnection, true);

6
这假设它是一个DbContext,但对于大多数使用VS2010或2008的人来说,这不是默认设置。 ObjectContext没有这样的构造函数。 - Erik Funkenbusch
这个答案建议实例化整个EF上下文,仅仅为了从EF连接字符串中获取一个字符串片段。甚至没有考虑它是否是IDisposable... - amarax

5
希望能对您有所帮助。
    private readonly ApplicationDbContext _applicationDbContext;
    string connectionString = string.Empty;

    public CommonService(ApplicationDbContext applicationDbContext)
    {
        _applicationDbContext = applicationDbContext;
        connectionString = _applicationDbContext.Database.GetDbConnection().ConnectionString;
    }

1
请查看其他回答,已经有解决 OP 问题的有效方案了。 :-) - L. Guthardt

5

我也遇到了这个问题,为了解决这个问题,您可以这样做:

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

1
本质在于第一行 - 喜欢它! - Dick de Reus

2

以下是获取连接字符串的通用方法:

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

1
在我的情况下,我只需要执行一个更新语句,所以我使用了以下结构。
_db.Database.ExecuteSqlCommand($"update ChiusureTurni set esportato = 1 where idChiusuraTurni = {idChiusura}");

在这种情况下,_db是我的数据库上下文,我利用了事务管理的优势。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接