实体框架 - 同时执行多个查询时出错

时间:2011-02-09 00:42:54

标签: c# .net entity-framework

在我的应用程序中,有两件事情同时发生。计时器会在后台线程中每隔几秒触发一次更新数据网格的请求。这是该线程运行的代码:

    // Query
    var qryPickupRequests = from pr in objDataContext.pickupRequests
                                .Include("toLocation")
                                .Include("fromLocation")
                                .Include("person")
                            orderby pr.creationDate ascending
                            select pr;

    // Refresh from server?
    if (boolRefreshFromServer)
        (qryPickupRequests as ObjectQuery).MergeOption = MergeOption.PreserveChanges;

    // Limit?
    if (intLimit > 0)
        return qryPickupRequests.Take(intLimit).ToList<pickupRequest>();
    else
        return qryPickupRequests.ToList<pickupRequest>();

现在,在UI线程中,还有另一个表单正在更新位置网格:

/// <summary>
/// Refreshes the specified location data grid
/// </summary>
/// <param name="sender">Instance of GridLookupEdit to update</param>
private static void RefreshLocations(object sender) {

    GridLookUpEdit objEditor = sender as GridLookUpEdit;

    objEditor.Properties.DataSource = BRData.Models.LocationModel.GetLocationList(true);
    objEditor.Properties.DisplayMember = "locationName";
    objEditor.Properties.ValueMember = "locationID";

}

我遇到的问题是这两个代码块是在同一时间执行的。我收到以下错误:

enter image description here

内部例外情况如下:

  

已经有一个开放的DataReader   与此Connection相关联   必须先关闭。

实体框架 - 或者我没有正确处理并发数据库操作的任何想法?

1 个答案:

答案 0 :(得分:4)

实体框架对象上下文不是线程安全的。确保你使用的每个线程使用不同的上下文 - 你的示例代码中不清楚你做了什么,但这是我对问题所在的第一个猜测。