Зараз я отримую цю помилку:
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 Server. Модель №1 http://content.screencast.com/users/Keith.Barrows/folders/Jing/media/bdb2b000-6e60-4af0-a7a1-2bb6b05d8bc1/Model1.png
Модель №2 - Ця модель знаходиться в базі даних на нашому сервері Prod і оновлюється щодня автоматичними каналами. alt text 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, якщо його ще немає. Перший час через це має бути повне витяг товарних запасів. Кожен раз, коли він запускається там, після цього нічого не повинно відбуватися, якщо нові номери не надходили протягом ночі.
Отже, велике запитання - як вирішити помилку транзакції, яку я отримую? Чи потрібно мені скидати та відтворювати свій контекст кожен раз через петлі (це не має для мене сенсу)?