如何将DbContext(EntityFramework SqlConnection)传递给另一个方法? - c#

将DbContext传递给另一种方法的问题,例如:

public bool MarkCustomerForDelete(Customer customerObj)
{
        using(var dbContext = new MyContext())
        {
            using(var dbTransaction = dbContext.Database.BeginTransaction())
            {

                //Clear all orders for the Given Customers          
                var orderList = dbContext.Orders.Where(x=>x.id == customerObj.OrderId).ToList();

                CommonLogicMethod(dbContext, orderList);

                //Logic 
                customerObj.Status = "Deleted";
// The Modification will fail over due to the Customer Object for that object is already attached to the DbContext with Previous Values
                dbContext.Entry(customerObj).State = EntityState.Modified;

                dbContext.SaveChanges();
                dbTransaction.Commit()
                return true;
            }
        }
}
public void DeleteOrderRelatedData(MyContext dbContext, List<Orders> orderList)
{
    foreach(var entity2 in entity2List)
    {
        var OrderAddresses = dbContext.OrderAddresses.Where(x=>x.Id == entity2.Id).ToList();
        //Now if here the dbContext has 100 Entities (Tables)
        //It internally Enumerates all the entities in the Local cache i.e. dbContext.Coupons.Local has all the Records from the DB in the Local present.


    }
}

问题:为什么将DbContext传递给另一个方法时内部调用所有数据,即dbContext.Customers.Local在First-Level Cache中将数据库中的所有数据?

问题:如何将DbContext从一种方法传递到另一种方法(而不产生上述给定问题)?

这是与数据修改有关的创建问题,即DeleteCustomer将进行故障转移。
现在,如果将DeleteOrderRelatedData中的代码合并到DeleteCustomer函数中,则可以正常工作。

我为dbContext添加了一个Logs,并且在将dbContext内部传递给Function时,它正在调用与不同查询相关的所有Select查询。

有关更多详细信息,请查看此视频:Link

使用的工具:

实体框架6.0
System.Data.Sqlite
方法边界方面的PostSharp。

参考方案

听起来您的问题与级联删除有关,但措辞很难理解...

您的问题中的陈述...

DbContext传递给另一个内部调用所有方法的方法
数据

... DbContexts不仅会自动“获取所有数据”,还必须触发引起它的某些事情。

在我看来,当您删除客户对象EF时,您手动执行级联删除的代码时,您可能应该做的只是将其添加到模型中,然后删除客户对象,从而消除了对所有这些额外逻辑的需求。

换句话说,您已经说过/试图说“删除客户时,还要查找并删除与客户相关的订单”。

在上面的代码示例中,您可以...

//Clear all orders for the Given Customers          
var orderList = dbContext.Orders.Where(x=>x.id == customerObj.OrderId).ToList();

这纯粹是通过执行“从customerid = customer.Id的订单中选择*”来获得订单。

然后在下面定义的方法中...

public void DeleteOrderRelatedData(MyContext dbContext, List<Orders> orderList)

...看来您要进一步删除该订单的所有地址。尽管您似乎没有在上面的示例中调用该方法。

相反,您可以执行以下操作,让EF担心数据库中所有子项和子项的删除。

Entity Framework (EF) Code First Cascade Delete for One-to-Zero-or-One relationship

Cascading deletes with Entity Framework - Related entities deleted by EF

Microsoft文档在这里...

https://msdn.microsoft.com/en-gb/data/jj591620.aspx

编辑:

我的答案是基于我知道EF可以立即执行的操作,似乎实际问题是由问题中未提及的组件引起的,问题不在于执行动作的层次结构,正如我解释过的那样。解决另一个第三方组件如何对EF行为产生不利影响的事实。

回答这个问题:

如何将DbContext从一种方法传递到另一种方法(而不产生上述给定问题)?

...只需这样做,因为在2个方法之间传递上下文不会单独导致您遇到的问题。

...

看来正确回答这个问题是不可能的:(

EntityFramework 6基于代码的数据库优先连接字符串配置 - c#

我正在尝试在没有app.config的情况下使现有应用程序正常工作(由于环境非常具体,因此需要使用它)。问题在于它在很大程度上依赖EntityFramework 6与SQL Server一起工作。我正在尝试使用code-based configuration,但无法弄清楚如何通过配置类提供正确的连接字符串。我做了一个配置类:public class MyCo…

Entity Framework DbEntityEntry>'不包含Where的定义 - c#

此代码狙击手来自Adding CreatedDate to an entity using Entity Framework 5 Code First public override int SaveChanges() { DateTime saveTime = DateTime.Now; foreach (var entry in this.ChangeT…

使用Entity Framework Core(2.1)调用标量函数的最佳实践 - c#

我经常需要从Web应用程序(ASP.NET Core / EF Core)中调用在SQL Server上定义的标量函数。由于这些函数只是简单的辅助函数,因此我也使用了许多辅助函数,因此我使用了通用模式来调用这些标量函数-借助EF Core 2.1可用的新查询类型。由于我是EF Core的新手,所以我的问题是这种模式是否会引起问题,并且/或者是否存在调用标量函…

如何在实体框架代码优先迁移中设置小数精度和小数位数 - c#

我正在使用实体框架迁移,并且需要设置实体中十进制属性的精度和小数位数。我只想对此单个十进制属性(而不是所有十进制属性)执行此操作。我已经重写了OnModelCreating方法,以默认将小数设置为(18,2)。我需要此属性为(22,5)。例如public class AdditionalCharge { public decimal? Rate { get;…

如何以编程方式将ListView滚动到最后一个元素-Compact Framework - c#

我正在使用Windows Mobile 6.1上的3.5 Compact Framework开发应用程序。我有一个ListView,添加项目时想自动滚动此列表。我能怎么做? 参考方案 listView.EnsureVisible(listView.Items.Count - 1);