Je reçois actuellement cette erreur:
System.Data.SqlClient.SqlException: la nouvelle transaction n'est pas autorisée car d'autres threads s'exécutent dans la session.
lors de l'exécution de ce 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;
}
}
}
Modèle # 1 - Ce modèle se trouve dans une base de données sur notre serveur de développement. Modèle # 1 http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/bdb2b000-6e60-4af0-a7a1-2bb6b05d8bc1/Model1.png
Modèle n ° 2 - Ce modèle se trouve dans une base de données sur notre serveur Prod et est mis à jour chaque jour par des flux automatiques. texte alternatif http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/4260259f-bce6-43d5-9d2a-017bd9a980d4/Model2.png
Remarque - Les éléments entourés de rouge dans le modèle n ° 1 sont les champs que j'utilise pour "mapper" au modèle n ° 2. Veuillez ignorer les cercles rouges dans le modèle n ° 2: cela vient d'une autre question que j'ai eue et à laquelle il est maintenant répondu.
Remarque: J'ai encore besoin de mettre un chèque isDeleted afin que je puisse le supprimer en douceur de DB1 s'il est sorti de l'inventaire de notre client.
Tout ce que je veux faire, avec ce code particulier, c'est connecter une entreprise dans DB1 avec un client dans DB2, obtenir leur liste de produits dans DB2 et l'insérer dans DB1 si elle n'est pas déjà là. La première fois devrait être un tirage complet de l'inventaire. Chaque fois qu'il y est exécuté, rien ne devrait se produire à moins qu'un nouvel inventaire n'entre dans le flux pendant la nuit.
Donc, la grande question - comment résoudre l'erreur de transaction que je reçois? Dois-je supprimer et recréer mon contexte à chaque fois à travers les boucles (cela n'a pas de sens pour moi)?