如何将 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
正在使用的工具:
- Entity Framework 6.0
- System.Data.Sqlite
- 方法边界方面的 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 记录痕迹。
现在这是在内部使用参数。
因为在记录时,它正在序列化参数,这就产生了问题。
将 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
正在使用的工具:
- Entity Framework 6.0
- System.Data.Sqlite
- 方法边界方面的 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 记录痕迹。 现在这是在内部使用参数。 因为在记录时,它正在序列化参数,这就产生了问题。