682 Stimmen

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

Ich erhalte derzeit diesen Fehler:

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

während dieser Code ausgeführt wird:

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. Alt-Text 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, die ich für die Zuordnung zu Modell 2 verwende. Bitte ignorieren Sie die roten Kreise in Modell Nr. 2: Sie stammen von einer anderen Frage, die ich hatte und die jetzt beantwortet ist.

Hinweis: Ich muss noch eine "isDeleted"-Prüfung einbauen, damit ich es aus DB1 sanft löschen kann, wenn es aus dem Bestand unseres Kunden verschwunden ist.

Alles, was ich mit diesem speziellen Code tun möchte, ist, eine Firma in DB1 mit einem Kunden in DB2 zu verbinden, ihre Produktliste aus DB2 abzurufen und sie in DB1 EINZUFÜGEN, wenn sie dort noch nicht vorhanden ist. Beim ersten Durchlauf sollte ein vollständiger Abruf des Bestands erfolgen. Bei jedem weiteren Durchlauf sollte nichts mehr passieren, es sei denn, über Nacht sind neue Bestände in den Feed gelangt.

Die große Frage ist also, wie ich den Transaktionsfehler, den ich erhalte, lösen kann. Muss ich meinen Kontext jedes Mal, wenn ich die Schleifen durchlaufe, löschen und neu erstellen (macht für mich keinen Sinn)?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X