C# 重用连接的实体框架
在用于连接到实体的使用块中 调用另一个方法时如何重用连接 因此,我:C# 重用连接的实体框架,c#,entity-framework,C#,Entity Framework,在用于连接到实体的使用块中 调用另一个方法时如何重用连接 因此,我: using (SampleEntities entities = new SampleEntities()) { entities.Connection.Open(); SomeMethod(); ... } void SomeMethod() { using (SampleEntities entities = new SampleEntities()) { // I w
using (SampleEntities entities = new SampleEntities()) {
entities.Connection.Open();
SomeMethod();
...
}
void SomeMethod() {
using (SampleEntities entities = new SampleEntities())
{
// I want to be able to use the existing connection before the method call, any ideas?
}
}
为什么不呢
void SomeMethod(SampleEnities context)
并把它传进来;让第一个使用排序处理。如果您使用的是相同的连接字符串,则会为您处理连接池 即使您正在使用dispose,它也不会关闭连接。它将其返回到池中供下次使用 对于事务作用域,您希望使用相同的连接,因此必须在释放该连接之前完成事务中的所有操作 因此: 用法:
using(SampleEntities entities = new SampleEntities()){
entites.Connection.Open();
SomeMethod(entities);
...
}
您可以使用以下文档创建ConnectionScope和DataContextScope:
这意味着您可以执行以下操作:
using (var connection = container.Resolve<IDbConnection>())
using (var context = container.Resolve<IMyDataContext>())
{
context.Connection = connection;
// Do some stuff...
context.SubmitChanges();
}
这就是我所做的,这是一种享受!这意味着context.SubmitChanges仅在堆栈顶部调用。因此,允许您调用使用连接/上下文的方法,而不用担心将它们作为参数传入。DbContext构造函数的重载允许您确定是否应在上下文被释放时释放现有连接。您需要将DbConnection传递到上下文,并要求它保持连接的活动状态:
using(SqlConnection con = new SqlConnection(conStr))
{
using(var context1 = new SampleEntities(existingConnection:con, contextOwnsConnection:false)
{
}
using(var context2 = new SampleEntities(existingConnection:con, contextOwnsConnection:false)
{
}
}
更改上下文以将参数传递给基:
class SampleEntities : DbContext
{
public SampleEntities(DbConnection existingConnection, bool contextOwnsConnection) :
base(existingConnection, contextOwnsConnection) )
{
}
}
我正在使用相同的连接字符串。如果我有一个事务作用域,我不想提升到MSDTC,因此,我希望能够重用现有连接。
using(SqlConnection con = new SqlConnection(conStr))
{
using(var context1 = new SampleEntities(existingConnection:con, contextOwnsConnection:false)
{
}
using(var context2 = new SampleEntities(existingConnection:con, contextOwnsConnection:false)
{
}
}
class SampleEntities : DbContext
{
public SampleEntities(DbConnection existingConnection, bool contextOwnsConnection) :
base(existingConnection, contextOwnsConnection) )
{
}
}