2012-10-22 92 views
28

我們使用實體框架5,但還有一個要求,即對於我們需要執行的一些自定義SQL,從應用程序中使用正常的數據庫連接。獲取實體框架連接字符串

所以,我創建了一個處理這個連接的DatabaseAccess類。有沒有一種方法可以通過檢查實體框架連接字符串填充連接字符串?

所以:

SqlConnection cnn; 
connetionString = "Data Source=ServerName;Initial Catalog=DatabaseName;User ID=UserName;Password=Password" 

能否建立,從檢查實體框架?

+0

您是先使用Code還是edmx文件?你在使用DbContext的ObjectContext嗎? –

回答

8

你的意思是,你可以在你的EF DbContext中使用SqlConnection嗎?

DbContext類有一個constructor您可以在其中傳遞一個SqlConnection,然後告訴EF它是否擁有它。

var YourContext = new YourContext(SqlConnection, true); 
+5

這假定它是一個DbContext,對於大多數使用VS2010或2008的人來說這不是默認的.ObjectContext沒有這樣的構造函數。 –

46

您可以通過以下獲得的ConnectionString使用EF:

MyDbContext.Database.Connection.ConnectionString 

或者正如馬克說,你可以用的SqlConnection

+0

這將顯示EF連接字符串,它在使用edmx文件時不能由標準SqlConnection使用。 –

+0

也不是這樣。您可以將DbContext與edmx文件一起使用,並且在使用此方法時,您仍然具有EntityConnection字符串而不是數據庫連接字符串。 –

+2

你似乎並不理解我的觀點。如果您使用的是DbContext和edmx文件,那麼您提到的ConnectionString屬性將* NOT *包含SqlConnection兼容連接字符串。它將有一個EntityConnection字符串,其中包含元數據字符串,而不包含元數據字符串。因此,不,你的方法,如果使用DbContext和一個edmx文件,將不允許某人獲取連接字符串並將其與SqlConnection一起使用。 –

19

是的,你可以initalise上下文。

請參閱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; 
} 
+2

難道你不能只使用'ctx.Connection.ConnectionString'? – cost

+2

這可能有所有的res://等東西雖然.. – cost

+0

@Wimpie拉特,這是完美的。它給出了確切的連接字符串。 PS:EntityConnection屬於System.Data.EntityClient命名空間。 –

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

即使在EF3,您可以使用EntityConnectionStringBuilder。

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

我也有這個問題,解決你可以這樣做的問題:

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

本質是在第一線 - 就像它! –

0

希望它有幫助..

private readonly ApplicationDbContext _applicationDbContext; 
    string connectionString = string.Empty; 

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

請看看其他答案,已經有解決OP問題的工作解決方案。 :-) –