entity framework获得sql连接
根据entity framework中显式关闭连接和http://msdn.microsoft.com/en-us/library/bb738582%28v=vs.90%29.aspx ,似乎我应该使用上下文来创建连接而不是做以下
using (SqlConnection con = new SqlConnection("Persist Security Info=False;Integrated Security=true;Initial Catalog=Remember;server=(local)")) { ... }
我的理解是,我会
- 摆脱连接字符串
- 利用EF内置的连接池
但是如何通过上下文获取SQL连接?
在EF5(为EF6更改)中,以下将返回连接:
var connection =((EntityConnection)context.Connection).StoreConnection;
如果您以正确的方式使用EF,您可能永远不需要获得内部数据库连接。
我发现魔法在于ExecuteStoreCommand()
new AdventureEntities().ExecuteStoreCommand( @" UPDATE Users SET lname = @lname WHERE Id = @id", new SqlParameter("lname", lname), new SqlParameter("id", id));
然后就不需要显式连接,它实际上使代码更加清晰。 上面的单行代码替换了以下所有代码
using (SqlConnection con = new SqlConnection("Persist Security Info=False;Integrated Security=true;Initial Catalog=Remember;server=(local)")) { con.Open(); using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = @" UPDATE Users SET lname = @lname WHERE Id = @id"; cmd.Parameters.AddWithValue("lname", lname); cmd.Parameters.AddWithValue("id", id); cmd.ExecuteNonQuery(); } }
我使用下一个代码来获取连接(Entity Framework 5.0):
var connection = Context.Database.Connection;
var efConnectionStringBuilder = new EntityConnectionStringBuilder(efConnectionString); string sqlConnectionString = efConnectionStringBuilder.ProviderConnectionString;
如果EF连接字符串存储在Web配置文件中,则可以使用以下代码将其分配给SQL数据源:
var connString = ConfigurationManager.ConnectionStrings["MyDataEntities"].ConnectionString; EntityConnection ec = new EntityConnection(connString); var storeConnect = ec.StoreConnection; SqlDataSource1.ConnectionString = storeConnect.ConnectionString;
您也可以使用以下内容。 我想将一些Dapper.NET注入到已经具有Entity框架实体上下文的现有项目中,因此我创建了以下内容:
public class EFConnectionAccessor : IDisposable { private readonly SqlConnection sqlConnection; private readonly MyEntities entities; public EFConnectionAccessor() { entities = new MyEntities(); var entityConnection = entities.Connection as EntityConnection; if (entityConnection != null) { sqlConnection = entityConnection.StoreConnection as SqlConnection; } } public SqlConnection connection { get { sqlConnection.Open(); return sqlConnection; } } public void Dispose() { sqlConnection.Close(); sqlConnection.Dispose(); entities.Dispose(); } }
叫做使用
using (SqlConnection sqlConnection = new EFConnectionAccessor().connection) { // ADO.NET CODE HERE - Or in my case dapper.net }
我相信在EF6中创建SqlConnection的最简单方法是执行以下操作:
DBContext context = new DBContext(); SqlConnection sqlconn = new SqlConnection(context.Database.Connection.ConnectionString);
DataContext允许您直接从DataContext引用调用实体对象,抽象出基础连接后勤的所有细节。