Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个使用块的替代方案_C#_.net_Entity Framework - Fatal编程技术网

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,但它的作用域比数据库事务更大。您可以获取数据,在内存中处理数据,最后将其保存到工作单元中的数据库中。这对于数据库事务来说运行时间太长。我最好将范围描述为“业务事务”。