Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# 使用EF使用单独的函数保存上下文中的所有更改_C#_Asp.net_Asp.net Mvc_Entity Framework_Dbcontext - Fatal编程技术网

C# 使用EF使用单独的函数保存上下文中的所有更改

C# 使用EF使用单独的函数保存上下文中的所有更改,c#,asp.net,asp.net-mvc,entity-framework,dbcontext,C#,Asp.net,Asp.net Mvc,Entity Framework,Dbcontext,我注意到在这个EntityFramework示例中,每个函数都有自己的带有DbContext的using语句 我的存储库有点不同,其中DbContext是使用依赖项注入发送的,并设置为私有属性 创建名为SaveAll的函数是否正常,如下所示: public bool SaveAll() { return _context.SaveChanges() > 0; } 然后在我的存储库中有一些函数,这些函数永远不会保存context.SaveChanges,而只是将项目添加到上下文中。

我注意到在这个EntityFramework示例中,每个函数都有自己的带有DbContext的using语句

我的存储库有点不同,其中DbContext是使用依赖项注入发送的,并设置为私有属性

创建名为SaveAll的函数是否正常,如下所示:

public bool SaveAll()
{
    return _context.SaveChanges() > 0;
}
然后在我的存储库中有一些函数,这些函数永远不会保存context.SaveChanges,而只是将项目添加到上下文中。最后,只需调用_repository.SaveAll()即可一次性保存所有内容

另一方面

有些函数内置了保存功能(在需要立即返回所创建对象的新Id的情况下:

public Product AddProduct(Product product)
{
    _context.Add(product);
    _context.SaveChanges();

    return product;
}
似乎在整个项目中,我都有各种各样的功能,基于需求,我只是想确保这是常见的,或者看看是否有更好的方法来处理这些场景

存储库功能:
-只会添加到上下文中

-添加到上下文然后保存上下文是不正常的…但是如果处理web请求,则为“正常”通常会为请求指示单个上下文实例,但在此之前需要对DB执行的任何操作都需要它们自己的专用DbContext..事实上,您有一些方法可以添加到上下文并立即保存,这会给您带来麻烦,因为您正在共享该上下文单独保存所有内容并可以被视为原子操作的方法应该在该函数中创建和销毁自己的DbContext

因此,将您的原子操作更改为:

public Product AddProduct(Product product)
{
  using( var context = new DbContext() )
  {
    context.Add(product);
    context.SaveChanges();
  }

   return product;
}

任何方法都可能是有效的,这取决于功能所做操作的语义含义。如果
AddProduct
是一个具有副作用的原子操作,那么它可以保存更改本身。否则,使用代码的用户总是希望在之后立即保存更改,这是不可取的,也可能不是全部可以这样做。另一方面,如果它是单个事务中更大操作集的一部分,那么在整个事务中多次调用
SaveChanges()
,可能会有问题。那么,您是否认为取消我创建的SaveChanges()函数而总是调用SaveChanges()会有问题在每个单独的功能中,我的最佳选择是什么?一点也不。我是说,这是一种基于观点的,取决于问题中未确定的语义和架构问题。听起来好像David说的是,你永远不应该“总是”做任何事情,但要做对功能或用例正确的事情,不管是什么,即使这会导致您在其他功能/用例中的操作方式产生明显的不一致。这里提到了一些非常好的观点,如果这个问题似乎是基于意见的,我表示歉意,但TMcKeown告诉了我确切的需要知道的内容。在做时web开发和处理web请求请求应该有一个单独的上下文实例。原子操作应该有自己的上下文。好的,你是说我上面展示的一个函数,在函数本身中实际调用了_Context.SaveChanges(),应该用(var db=new MyContext())包装起来,否则,因为我处理的是web,所以使用注入上下文的所有内容都应该使用一组函数,这些函数只添加到上下文中,然后最终调用SaveAll().有意义吗?有没有办法解决我需要立即检索productId,但仍然将其拆分为两个单独的函数的情况,或者我除了执行上面的操作之外别无选择?很好,您的更新正是我想要确认的。因此,让原子操作和存储库函数只添加到开发web时的环境?是的,有时在发送大量工作单元之前,您需要一些东西“在那里”。