SqlException de Entity Framework: no se permite una nueva transacción porque hay otros subprocesos que se ejecutan en la sesión
Actualmente estoy recibiendo este error:
System.Data.SqlClient.SqlException: La nueva transacción no está permitida porque hay otros subprocesos ejecutándose en la sesión.
mientras se ejecuta este código:
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;
}
}
}
Modelo n.º 1: este modelo se encuentra en una base de datos de nuestro servidor de desarrollo.Modelo # 1 http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/bdb2b000-6e60-4af0-a7a1-2bb6b05d8bc1/Model1.png
Modelo n. ° 2: este modelo se encuentra en una base de datos de nuestro Prod Server y se actualiza todos los días mediante feeds automáticos.alt text http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/4260259f-bce6-43d5-9d2a-017bd9a980d4/Model2.png
Nota: los elementos con un círculo rojo en el Modelo n. ° 1 son los campos que uso para "mapear" al Modelo n. ° 2. Por favor ignore los círculos rojos en el Modelo # 2: es de otra pregunta que tengo y que ahora está respondida.
Nota: Todavía necesito realizar una verificación de IsDeleted para poder borrarlo de la DB1 si se ha salido del inventario de nuestro cliente.
Todo lo que quiero hacer, con este código en particular, es conectar una compañía en DB1 con un cliente en DB2, obtener su lista de productos de DB2 e INSERTARLA en DB1 si aún no está allí. La primera vez a través debe ser un tirón completo de inventario. Cada vez que se ejecuta allí, no debe ocurrir nada a menos que se ingrese un nuevo inventario durante la noche.
Entonces, la gran pregunta: ¿cómo resuelvo el error de transacción que recibo? ¿Necesito soltar y recrear mi contexto cada vez que pasa por los bucles (no tiene sentido para mí)?