[英]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添加了一个Logs,并且在将dbContext内部传递给Function时,它正在调用与不同查询相关的所有Select查询。
有关更多详细信息,请查看此视频: 链接
使用的工具:
听起来您的问题与级联删除有关,但措辞很难理解...
您的问题中的陈述...
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担心db中所有子项和子项的删除。
Microsoft文档在这里...
https://msdn.microsoft.com/en-gb/data/jj591620.aspx
编辑:
我的答案是基于我知道EF可以立即执行的操作,似乎实际问题是由问题中未提及的组件引起的,问题不在于执行动作的层次结构,正如我解释过的那样。解决另一个第三方组件如何对EF行为产生不利影响的事实。
回答这个问题:
如何将DbContext从一种方法传递到另一种方法(而不产生上述给定问题)?
...只需这样做,因为在2个方法之间传递上下文不会单独导致您遇到的问题。
...
看来正确回答这个问题是不可能的:(
问题归结于:我正在使用PostSharp ,使用OnMethodBoundaryAspect记录跟踪。 现在,这是在内部使用Arguments。 自从Logging以来,它正在序列化参数,这正在产生问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.