Entity Framework Db Первое: новая транзакция не разрешена, потому что в сеансе запущены другие потоки - PullRequest
0 голосов
/ 04 ноября 2018

Я искал в Интернете эту проблему, но все, что я могу найти, связано с циклами 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 #

...