SqlException from Entity Framework - Neue Transaktion ist nicht zulässig, da in der Sitzung andere Threads ausgeführt werden

Ich erhalte derzeit folgende Fehlermeldung:

System.Data.SqlClient.SqlException: Neue Transaktion ist nicht zulässig, da in der Sitzung andere Threads ausgeführt werden.

während Sie diesen Code ausführen:

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;
        }
    }
}

Modell 1 - Dieses Modell befindet sich in einer Datenbank auf unserem Entwicklungsserver.Modell 1 http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/bdb2b000-6e60-4af0-a7a1-2bb6b05d8bc1/Model1.png

Modell 2 - Dieses Modell befindet sich in einer Datenbank auf unserem Prod-Server und wird täglich durch automatische Feeds aktualisiert.Alternativtext http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/4260259f-bce6-43d5-9d2a-017bd9a980d4/Model2.png

Hinweis - Die rot eingekreisten Elemente in Modell 1 sind die Felder, mit denen ich Modell 2 "zuordnen" kann. Bitte ignorieren Sie die roten Kreise in Modell 2: Das ist eine andere Frage, die ich hatte und die jetzt beantwortet wird.

Hinweis: Ich muss immer noch einen isDeleted-Scheck einreichen, damit ich ihn vorübergehend aus DB1 löschen kann, wenn er nicht mehr im Inventar unseres Kunden vorhanden ist.

Alles, was ich mit diesem speziellen Code tun möchte, ist, eine Firma in DB1 mit einem Client in DB2 zu verbinden, deren Produktliste von DB2 abzurufen und sie in DB1 einzufügen, falls sie noch nicht vorhanden ist. Zum ersten Mal sollte eine vollständige Bestandsaufnahme durchgeführt werden. Jedes Mal, wenn es dort ausgeführt wird, sollte nichts geschehen, es sei denn, über Nacht ist neues Inventar im Futter eingegangen.

Also die große Frage - wie löse ich den Transaktionsfehler, den ich bekomme? Muss ich meinen Kontext jedes Mal durch die Schleifen löschen und neu erstellen (ergibt für mich keinen Sinn)?

Antworten auf die Frage(19)

Ihre Antwort auf die Frage