Я сейчас получаю эту ошибку:
System.Data.SqlClient.SqlException: новая транзакция не разрешена, поскольку в сеансе запущены другие потоки.
во время выполнения этого кода:
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;
}
}
}
Модель # 1 - эта модель находится в базе данных на нашем Dev-сервере.
Модель # 1 http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/bdb2b000-6e60-4af0-a7a1-2bb6b05d8bc1/Model1.png
Модель # 2 - Эта модель находится в базе данных на нашем Prod Server и обновляется каждый день автоматическими лентами. альтернативный текст http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/4260259f-bce6-43d5-9d2a-017bd9a980d4/Model2.png
Примечание. Элементы в красном кружке в модели # 1 - это поля, которые я использую для "сопоставления" с моделью № 2. Пожалуйста, не обращайте внимания на красные кружки в Модели № 2: это из другого моего вопроса, на который теперь дан ответ.
Примечание: мне все еще нужно поставить проверку isDeleted, чтобы я мог без проблем удалить ее из DB1, если она вышла из инвентаря нашего клиента.
Все, что я хочу сделать с этим конкретным кодом, - это связать компанию в DB1 с клиентом в DB2, получить их список продуктов из DB2 и вставить его в DB1, если его там еще нет. Первый раз должен быть полный запас инвентаря. Каждый раз, когда он запускается там, после того, как ничего не произойдет, если за ночь не появятся новые материалы на корме.
Итак, большой вопрос - как мне исправить полученную ошибку транзакции? Нужно ли мне каждый раз отбрасывать и пересоздавать свой контекст через циклы (не имеет смысла для меня)?