ขณะนี้ฉันได้รับข้อผิดพลาดนี้:
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 และ INSERT ใน DB1 หากยังไม่ได้มี ครั้งแรกที่ผ่านควรมีการดึงสินค้าคงคลังอย่างเต็มรูปแบบ ทุกครั้งที่เรียกใช้ที่นั่นหลังจากไม่มีสิ่งใดเกิดขึ้นเว้นแต่ว่ามีคลังโฆษณาใหม่เข้ามาในฟีดข้ามคืน
ดังนั้นคำถามใหญ่ - ฉันจะแก้ไขข้อผิดพลาดการทำธุรกรรมที่ฉันได้รับอย่างไร ฉันจำเป็นต้องวางและสร้างบริบทของฉันใหม่ทุกครั้งผ่านลูป (ไม่สมเหตุสมผลกับฉัน) หรือไม่