【问题标题】:Entity fails on simulataneous AJAX posts实体在同时发布的 AJAX 帖子上失败
【发布时间】:2012-12-28 02:59:34
【问题描述】:

我有一个基于 Jquery Droppable/Sortable 更新数据库的操作。第一个 AJAX 帖子工作正常,但第二个给我错误:

     New transaction is not allowed because there are other 
threads running in the session.

它被发布到同一个控制器上的 2 个单独的操作,在控制器中使用相同的 UnitOfWork。不知道我该怎么做才能解决这个问题。

编辑:这是两个被调用的服务方法:

public void   NavItemSort(List<string> orderArray, string navID, string subNavID)
{

    var newOrderArray = orderArray.Where(s => !string.IsNullOrWhiteSpace(s)).ToList();

    var orderArrayIDs = newOrderArray.Select(x => x.Replace("ContentItem", "")).ToList();

    var itemToBeSorted = Convert.ToInt32(orderArrayIDs.FirstOrDefault());

    var itemContext = cmsUnitOfWork.NavigationItems.Find().Where(x => x.ID == itemToBeSorted).ToList().FirstOrDefault();



    var currentSortOrder = cmsUnitOfWork.NavigationItems.Find()
                                                        .Where(x => x.NavID == itemContext.NavID && 
                                                        (itemContext.ParentID == null) ? x.ParentID == null :  
                                                        x.ParentID == itemContext.ParentID).ToList();

    var existingItems = currentSortOrder.Select(x => x.ID).ToList();

    List<string> existingItemsString = existingItems.ConvertAll<string>(x => x.ToString()).ToList();

    var newNavItemID = existingItemsString.Except(orderArray).FirstOrDefault();

    var currentSortOrderExcept = currentSortOrder.Where(x => x.ID != Convert.ToInt32(newNavItemID));


    foreach (var x in currentSortOrderExcept)
        {
            int sortOrderInt = orderArrayIDs.IndexOf(orderArrayIDs.Where(z => int.Parse(z) == x.ID).ToList().FirstOrDefault()) + 1; 


            NavigationItem navigationItem = new NavigationItem()
            {
                HasChild = x.HasChild,
                Level = x.Level,
                NavID = x.NavID,
                ID = x.ID,
                ParentID = x.ParentID,
                PageID = x.PageID,
                URL = x.URL,
                Title = x.Title,
                SortOrder = sortOrderInt,

            };

            if (navigationItem.SortOrder != null && navigationItem.SortOrder != 0)
            {
                cmsUnitOfWork.NavigationItems.Update(x, navigationItem);

            }

        }
        cmsUnitOfWork.Commit();
}
public void NavItemAdd(List<string> orderArray, string NavID, string subNavID){

    var newOrderArray = orderArray.Where(s => !string.IsNullOrWhiteSpace(s)).ToList();
    var orderArrayIDs = newOrderArray.Select(x => x.Replace("ContentItem", "")).ToList();

    NavID = NavID.Replace("nav", "");

    int NavIDInt = int.Parse(NavID);
    int subNavIDInt = int.Parse(subNavID);

    var existingNavItems = cmsUnitOfWork.NavigationItems.Find().Where(x => x.NavID == NavIDInt && x.ParentID == subNavIDInt).ToList();

    int currentSortOrder = 0;

    if (existingNavItems.Count() != 0)
    {
        currentSortOrder = existingNavItems.Max(x => x.SortOrder);
    }


    var existingItems = existingNavItems.Select(x => x.ID).ToList();

    List<string> existingItemsString = existingItems.ConvertAll<string>(x => x.ToString()).ToList();

    var newNavItemID = orderArray.Except(existingItemsString).FirstOrDefault();
    int newNavIDInt = int.Parse(newNavItemID);

    var newNavItemList = cmsUnitOfWork.NavigationItems.Find().Where(x => x.ID == newNavIDInt).ToList();

    var newNavItem = newNavItemList.FirstOrDefault();

    var parentNav = cmsUnitOfWork.NavigationItems.Find().Where(x => x.ID == subNavIDInt).ToList().FirstOrDefault();

    NavigationItem navigationItemUpdated = new NavigationItem()
    {
        ID = newNavItem.ID,
        Level = 2,
        NavID = NavIDInt,
        PageID = newNavItem.PageID,
        Title = newNavItem.Title,
        URL = newNavItem.URL,
        ParentID = subNavIDInt,
        SortOrder = currentSortOrder + 1
    };

    cmsUnitOfWork.NavigationItems.Update(newNavItem, navigationItemUpdated);
    cmsUnitOfWork.Commit();


}

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework asp.net-mvc-4 linq-to-entities entity-framework-5


    【解决方案1】:

    也许您已将 cmsUnitOfWork 声明为静态变量?每个请求都必须创建和销毁上下文

    【讨论】:

      【解决方案2】:

      我猜你是针对那个上下文启动了一个事务并且你从来没有处理过它而不是提交它。只是猜测,因为您没有丢失任何代码(请发布代码)

      【讨论】:

      • 对不起,我添加了我的两个服务方法。这些通过 AJAX 同时调用。
      猜你喜欢
      • 2020-05-31
      • 2020-11-16
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多