如何在实例化自定义对象时保持DbContext连接打开
本文关键字:DbContext 连接 实例化 自定义 对象 | 更新日期: 2023-09-27 18:07:05
我正在尝试实例化一个自定义对象,该对象在数据库对象上钻取几个级别,并且我正在获得运行时数据库连接错误。
在我的控制器类…
private MyEntities db = new MyEntities();
...
foreach (Order thisOrder in orders) {
CustomerActionReturnModel thisAction = new CustomerActionReturnModel(thisOrder);
thisAction.Order.OrderItems = new List<OrderItemReturnModel>();
foreach (OrderItem thisItem in thisOrder.OrderItems) {
thisAction.Order.OrderItems.Add(new OrderItemReturnModel(thisItem));
}
thisResponse.CustomerActions.Add(thisAction);
}
...
protected override void Dispose(bool disposing) {
if (disposing) {
db.Dispose();
}
base.Dispose(disposing);
}
在我的模型类
...
[ModelName("OrderItemReturnModel")]
public class OrderItemReturnModel {
...
public OrderItemReturnModel(OrderItem dbOrderItem) {
OrderItemID = dbOrderItem.OrderItemID;
PriceCharged = dbOrderItem.PriceCharged;
if (dbOrderItem.Quantity != null) {
Quantity = (int)dbOrderItem.Quantity;
}
ProductDescription = dbOrderItem.StoreProduct.Product.Description;
ProductImageURL = dbOrderItem.StoreProduct.Product.ImageURLFormatted48;
}
如你所见,我尝试访问
dbOrderItem.StoreProduct.Product.Description;
和
dbOrderItem.StoreProduct.Product.ImageURLFormatted48;
它不喜欢它
"Message": "An error has occurred.",
"ExceptionMessage": "ExecuteReader requires an open and available Connection. The connection's current state is closed.",
"ExceptionType": "System.InvalidOperationException"
是否有任何方法我可以保持我的dbContext打开,而我正在构建我的OrderItemReturnModel?
我知道你正在使用ASP。. NET既然你提到"在我的控制器",所以请不要使用控制器级db上下文。
在asp.net这样的多线程环境中这样做会导致很多问题。
推荐的方法是在using语句中需要的任何地方创建DbContext实例:
在您的控制器中(或者更好的是,在服务类、存储库或业务管理器中):
using (var db = new MyEntities()){
//use db to fetch orders
foreach (Order thisOrder in orders) {
CustomerActionReturnModel thisAction = new CustomerActionReturnModel(thisOrder);
thisAction.Order.OrderItems = new List<OrderItemReturnModel>();
foreach (OrderItem thisItem in thisOrder.OrderItems) {
thisAction.Order.OrderItems.Add(new OrderItemReturnModel(thisItem));
}
thisResponse.CustomerActions.Add(thisAction);
}
}
DbContext被设计成一个短寿命对象,将其声明为成员变量不会为您提供更好的性能,而是相反。