Ich erhalte derzeit diesen Fehler:
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 Dev Server. Modell Nr. 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, die ich zum "Zuordnen" zu Modell 2 verwende. 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 noch eine isDeleted-Prüfung durchführen, damit ich sie sanft aus DB1 löschen kann, wenn sie aus dem Inventar unseres Kunden verschwunden ist.
Mit diesem speziellen Code möchte ich lediglich eine Firma in DB1 mit einem Client in DB2 verbinden, deren Produktliste aus DB2 abrufen und in DB1 einfügen, falls diese noch nicht vorhanden ist. Das erste Mal sollte eine vollständige Bestandsaufnahme erfolgen. Jedes Mal, wenn es dort ausgeführt wird, sollte nichts passieren, es sei denn, über Nacht wurde neues Inventar in den Feed aufgenommen.
Die große Frage ist also, wie ich den Transaktionsfehler lösen kann, den ich bekomme. Muss ich meinen Kontext jedes Mal durch die Schleifen löschen und neu erstellen (macht für mich keinen Sinn)?