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

How to pass DbContext (EntityFramework SqlConnection) to another Method?

将 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 中的所有数据都在一级缓存中?

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

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

我为 dbContext 添加了一个日志,而 dbContext 在将其传递给内部函数时正在调用与不同查询相关的所有 Select 查询..

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

正在使用的工具:

  1. Entity Framework 6.0
  2. System.Data.Sqlite
  3. 方法边界方面的 PostSharp。

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

你问题中的陈述......

DbContext is passed to another method internally calls for all the data

...DbContext 不只是自动 "go and get all data",您必须触发导致它的原因。

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

换句话说,你已经说过/正在尝试说 "when a customer is deleted, also find and remove the customers related orders"。

在上面的代码示例中,您执行...

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

这纯粹是通过执行"select * from orders where 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 个方法之间传递上下文本身不会导致您遇到的问题。

...

看来这道题不可能答对:(

问题是由于: 我使用 PostSharp,使用 OnMethodBoundaryAspect 记录痕迹。 现在这是在内部使用参数。 因为在记录时,它正在序列化参数,这就产生了问题。