如何在实例化自定义对象时保持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?

如何在实例化自定义对象时保持DbContext连接打开

我知道你正在使用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被设计成一个短寿命对象,将其声明为成员变量不会为您提供更好的性能,而是相反。