Entity Framework中的SqlException-不允许新事务,因为会话中正在运行其他线程

拜拜、爱过 提交于 2020-08-17 16:04:54

问题:

I am currently getting this error: 我目前收到此错误:

System.Data.SqlClient.SqlException: New transaction is not allowed because there are other threads running in the session. System.Data.SqlClient.SqlException:不允许新事务,因为会话中正在运行其他线程。

while running this code: 在运行此代码时:

public class ProductManager : IProductManager
{
    #region Declare Models
    private RivWorks.Model.Negotiation.RIV_Entities _dbRiv = RivWorks.Model.Stores.RivEntities(AppSettings.RivWorkEntities_connString);
    private RivWorks.Model.NegotiationAutos.RivFeedsEntities _dbFeed = RivWorks.Model.Stores.FeedEntities(AppSettings.FeedAutosEntities_connString);
    #endregion

    public IProduct GetProductById(Guid productId)
    {
        // Do a quick sync of the feeds...
        SyncFeeds();
        ...
        // get a product...
        ...
        return product;
    }

    private void SyncFeeds()
    {
        bool found = false;
        string feedSource = "AUTO";
        switch (feedSource) // companyFeedDetail.FeedSourceTable.ToUpper())
        {
            case "AUTO":
                var clientList = from a in _dbFeed.Client.Include("Auto") select a;
                foreach (RivWorks.Model.NegotiationAutos.Client client in clientList)
                {
                    var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a;
                    foreach (RivWorks.Model.Negotiation.AutoNegotiationDetails companyFeedDetail in companyFeedDetailList)
                    {
                        if (companyFeedDetail.FeedSourceTable.ToUpper() == "AUTO")
                        {
                            var company = (from a in _dbRiv.Company.Include("Product") where a.CompanyId == companyFeedDetail.CompanyId select a).First();
                            foreach (RivWorks.Model.NegotiationAutos.Auto sourceProduct in client.Auto)
                            {
                                foreach (RivWorks.Model.Negotiation.Product targetProduct in company.Product)
                                {
                                    if (targetProduct.alternateProductID == sourceProduct.AutoID)
                                    {
                                        found = true;
                                        break;
                                    }
                                }
                                if (!found)
                                {
                                    var newProduct = new RivWorks.Model.Negotiation.Product();
                                    newProduct.alternateProductID = sourceProduct.AutoID;
                                    newProduct.isFromFeed = true;
                                    newProduct.isDeleted = false;
                                    newProduct.SKU = sourceProduct.StockNumber;
                                    company.Product.Add(newProduct);
                                }
                            }
                            _dbRiv.SaveChanges();  // ### THIS BREAKS ### //
                        }
                    }
                }
                break;
        }
    }
}

Model #1 - This model sits in a database on our Dev Server. 模型#1-该模型位于开发服务器上的数据库中。 Model #1 http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/bdb2b000-6e60-4af0-a7a1-2bb6b05d8bc1/Model1.png 型号1 http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/bdb2b000-6e60-4af0-a7a1-2bb6b05d8bc1/Model1.png

Model #2 - This model sits in a database on our Prod Server and is updated each day by automatic feeds. 模型2-该模型位于Prod Server上的数据库中,并且每天通过自动Feed进行更新。 alt text http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/4260259f-bce6-43d5-9d2a-017bd9a980d4/Model2.png 替代文字http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/4260259f-bce6-43d5-9d2a-017bd9a980d4/Model2.png

Note - The red circled items in Model #1 are the fields I use to "map" to Model #2. 注意-模型#1中带红色圆圈的项目是我用来“映射”到模型#2的字段。 Please ignore the red circles in Model #2: that is from another question I had which is now answered. 请忽略模型2中的红色圆圈:这是我遇到的另一个问题,现在可以回答。

Note: I still need to put in an isDeleted check so I can soft delete it from DB1 if it has gone out of our client's inventory. 注意:我仍然需要进行isDeleted支票,以便在DB1超出我们客户的库存范围时可以将其从DB1中软删除。

All I want to do, with this particular code, is connect a company in DB1 with a client in DB2, get their product list from DB2 and INSERT it in DB1 if it is not already there. 我要做的就是用这个特定的代码将DB1中的一家公司与DB2中的一个客户连接起来,从DB2中获取他们的产品列表,如果还没有,请在DB1中插入它。 First time through should be a full pull of inventory. 第一次应该是充分利用库存。 Each time it is run there after nothing should happen unless new inventory came in on the feed over night. 每次在此运行时,除非夜间通入饲料中的新库存,否则什么都不会发生。

So the big question - how to I solve the transaction error I am getting? 因此,最大的问题-如何解决我遇到的交易错误? Do I need to drop and recreate my context each time through the loops (does not make sense to me)? 每次循环时都需要删除并重新创建上下文(对我来说没有意义)吗?


解决方案:

参考一: https://stackoom.com/question/8rog/Entity-Framework中的SqlException-不允许新事务-因为会话中正在运行其他线程
参考二: https://oldbug.net/q/8rog/SqlException-from-Entity-Framework-New-transaction-is-not-allowed-because-there-are-other-threads-running-in-the-session
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!