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

时间:2016-03-16 10:50:41

标签: c# entity-framework sqlite entity-framework-6 system.data.sqlite

将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添加了一个Logs,dbContext在向内部传递给Function时调用了与不同Queries相关的所有Select查询。

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

正在使用的工具:

  1. Entity Framework 6.0
  2. System.Data.Sqlite
  3. MethodBoundary Aspect的PostSharp。

2 个答案:

答案 0 :(得分:2)

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

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

  

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

... DbContexts不只是“自动获取所有数据”,你必须触发引起它的东西。

听起来像是在删除客户对象EF时,您正在手动实现级联删除的代码,而您应该做的只是将其添加到模型中,然后删除客户对象,而无需全部这个额外的逻辑。

换句话说,您已经/正在试图说“当客户被删除时,也会找到并删除客户相关的订单”。

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

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

这纯粹是通过执行“select * from 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从一个方法传递到另一个方法(没有创建上面给出的问题)?

...只是这样做,因为在两种方法之间传递一个上下文本身不会导致你遇到的问题。

...

似乎无法正确回答这个问题:(

答案 1 :(得分:0)

问题是由于: 我正在使用 PostSharp ,使用 OnMethodBoundaryAspect 来记录跟踪。 现在这是在内部使用Arguments。 因为在Logging时,它正在序列化Arguments,而这正在创建问题。