Я искал в Интернете эту проблему, но все, что я могу найти, связано с циклами foreach, и, безусловно, это не так.
Это код:
public async Task SyncProducts(List<Products> prodotti)
{
Service.CatalogProduct.CatalogProductRepository serviceRepository =
new Service.CatalogProduct.CatalogProductRepository(WebSite);
var context = EvoDataContext.GetDataContext(ConnectionUtilities.GetDatabaseDittaConnectionString("DEMO"));
List<Products> prodottisimple = (from c in prodotti
where c.type.Equals("simple")
select c).ToList();
List<Products> prodotticonfigurable = (from c in prodotti
where c.type.Equals("configurable")
select c).ToList();
foreach (Products prodotto in prodotticonfigurable)
{
var AssociatedSimples = ProductData.GetSimplesFromConfigurable(prodotto,
prodottisimple);
foreach (Products simple in AssociatedSimples)
{
var builders = new ProdottoInterfaceBuilder(simple,WebSite);
var inters = builders.GetProduct();
await Logs.WriteLineAsync(string.Format("Sincronizzo SKU {0} (simple)", simple.Sku));
await serviceRepository.AddUpdProduct(inters);
simple.LastSync = DateTime.Now;
simple.ReSync = false;
}
var builder = new ProdottoInterfaceBuilder(prodotto, WebSite);
var interc = builder.GetProduct(AssociatedSimples);
await Logs.WriteLineAsync(string.Format("Sincronizzo SKU {0} (configurable)", prodotto.Sku));
await serviceRepository.AddUpdProduct(interc);
await Logs.WriteLineAsync(string.Format("Link dei prodotti in corso...", prodotto.Sku));
var attributes = context.SyncProductAttributes.Select(c => c);
var options = context.SyncAttributeOptions.Select(c => c);
await serviceRepository.LinkProducts(interc, AssociatedSimples,attributes,options);
prodotto.LastSync = DateTime.Now;
prodotto.ReSync = false;
}
context.SaveChanges();
}
этот код прекрасно работает, кроме случаев, когда я что-то делаю конкретно.
Если я выполню еще одну задачу до этого, она не будет выполнена в context.SaveChanges ()
Я обнаружил, что проблема заключается в том, что я вызываю хранимую процедуру через Entity Framework. Эта хранимая процедура фактически обновляет некоторые поля в базе данных. Кажется, что EF «обнаруживает» эти изменения и «думает», что другой поток модифицирует базу данных.
Это код, где я вызываю хранимую процедуру:
private async Task UpdatePrice()
{
@logs.WriteLine("Aggiorno prezzi...");
var context = EvoDataContext.GetDataContext();
context.UpdatePrices(Store.Cd_Store); //this is the stored procedure
context.SaveChanges();
context.ChangeTracker.DetectChanges(); //I tried to add this
}
Как я могу исправить эту проблему? Хранимая процедура важна, потому что она выполняет операции, которые я не могу сделать в C #