我目前遇到了这个错误:
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 服务器上的数据库中,并且每天通过自动供应更新。 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 中,则将其插入到 DB1 中。 第一次运行应该是完全提取库存。 之后每次运行都不应发生任何事情,除非新的库存在夜间供应中出现。
那么最重要的问题是 - 我如何解决我正在遇到的事务错误? 我需要在循环中每次放弃并重新创建我的上下文吗(这对我来说没有意义)?