C# 多个使用块的替代方案
在我看到的所有实体框架数据访问示例中,每个方法都有自己的C# 多个使用块的替代方案,c#,.net,entity-framework,C#,.net,Entity Framework,在我看到的所有实体框架数据访问示例中,每个方法都有自己的using块,如下所示 有没有其他方法可以替代这种方法?例如,上下文对象可以只是类成员,例如: MyModelContext context = new MyModelContext(); 为什么必须为DAO类中的每个方法创建一个新的上下文对象 public class DaoClass { public void DoSomething() { using (var context = new MyMo
using
块,如下所示
有没有其他方法可以替代这种方法?例如,上下文对象可以只是类成员,例如:
MyModelContext context = new MyModelContext();
为什么必须为DAO类中的每个方法创建一个新的上下文对象
public class DaoClass
{
public void DoSomething()
{
using (var context = new MyModelContext())
{
// Perform data access using the context
}
}
public void DoAnotherThing()
{
using (var context = new MyModelContext())
{
// Perform data access using the context
}
}
public void DoSomethingElse()
{
using (var context = new MyModelContext())
{
// Perform data access using the context
}
}
}
你展示它的方式就是我在任何地方都看到的。我发现类级声明返回陈旧或不正确的数据时会出现一些奇怪的问题 为了避免重复所有代码,我喜欢编写一个可以重用的execute方法,或者在不必每次使用的情况下进行更改
private T Execute<T>(Func<MyModelContext, T> function)
{
using (MyModelContext ctx = new MyModelContext())
{
var result = function(ctx);
ctx.SaveChanges();
return result;
}
}
public List<Type> GetTypes()
{
return Execute((ctx) =>
{
return ctx.Types.ToList();
});
}
private T Execute(Func函数)
{
使用(MyModelContext ctx=newmymodelcontext())
{
var结果=函数(ctx);
ctx.SaveChanges();
返回结果;
}
}
公共列表GetTypes()
{
返回执行((ctx)=>
{
返回ctx.Types.ToList();
});
}
您可以使用DaoClass
实现IDisposable
,并将上下文作为类的属性。只需确保使用语句将DaoClass
包装在中,或在DaoClass
实例上调用Dispose()
public class DaoClass : IDisposable
{
MyModelContext context = new MyModelContext();
public void DoSomething()
{
// use the context here
}
public void DoAnotherThing()
{
// use the context here
}
public void DoSomethingElse()
{
// use the context here
}
public void Dispose()
{
context.Dispose();
}
}
请注意,上下文
对象相当于数据库事务
它实现了IDisposable
接口,因为在完成时必须关闭事务,并且您必须使用using
语句,或者像Lews-Therin演示的那样实现IDisposable
我们使用上下文
对象的多个实例来分隔不同的事务。在某些情况下,您希望所有更改都作为一个事务进行,并一起提交或回滚所有更改。然后将其全部放在一个上下文实例中。但也有一些情况下,您希望将一个数据包的保存与另一个数据包的保存分开。然后使用不同的事务,即不同的context
对象
为了更好地理解本章,请看一下工作单元模式
希望我能帮上忙,梅里 您可以通过在构建过程中将上下文实例化为字段、在dao类上实现IDisposable并确保所有使用者都正确地处理它,将处理的责任推给使用者。在您当前的情况下,每个方法都负责调配和处置其资源。因此,在我的原始帖子中使用语句的唯一好处是处置对象吗?对吗?对<代码>使用
语句只是语法上的糖分。它将语句包装在try…finally
块的括号中,并在finally
块中调用对象的Dispose()
方法。请参阅。注意,虽然DbContext实例旨在支持UnitOfWork,但它的作用域比数据库事务更大。您可以获取数据,在内存中处理数据,最后将其保存到工作单元中的数据库中。这对于数据库事务来说运行时间太长。我最好将范围描述为“业务事务”。