Ef core Экземпляр типа сущности 'CurrencyMapping' не может быть отслежен, ошибка - PullRequest
0 голосов
/ 06 марта 2020

Привет Недавно я обновил свой. net core 2.1 проект до 3.1 и начал ломать мои существующие тестовые модули. У меня есть тестовый пример ниже.

public async void ShouldAddOrUpdateFxRate_WhenFxRateEntityIsNew()
        {
            var mockProductsDbContext = ProductsDbContextInMemory();
            var currencyMappingId = 12345;
            string sourceCurrency = "US_Dollar";
            string destination = "NewZealand";
            string destinationCurrency = "NZ";
            DateTime validFrom = DateTime.UtcNow;
            FxRate fxRate = GetFxRate(currencyMappingId, sourceCurrency, destination, destinationCurrency, 0.73M, validFrom, validFrom.AddMonths(2));
            mockProductsDbContext.FxRates.Add(fxRate);
            mockProductsDbContext.SaveChanges();
            contextProviderServiceMock.CreateProductsDbContext().Returns(mockProductsDbContext);

            var inputFxrate = new FxRate()
            {
                ExchangeRate = 12,
                ValidFrom = DateTime.Now.AddMonths(3),
                ValidTo = DateTime.Now.AddMonths(6),
                CurrencyMappingId = currencyMappingId,
                CurrencyMapping = new CurrencyMapping
                {
                    DestinationCountry = destination,
                    SourceCurrency = sourceCurrency,
                    FromCurrencyCode = "USD",
                    ToCurrencyCode = destinationCurrency,
                    Id = currencyMappingId,
                }
            };
            var fxRateRepository = new FxRateRepository(contextProviderServiceMock, loggerMock.Object);
            // When
            await fxRateRepository.AddOrUpdateFxRate(inputFxrate);
            var fxRateEntityCount = await mockProductsDbContext.FxRates.CountAsync();
            Assert.Equal<int>(2, fxRateEntityCount);
        }

У меня есть код ниже для AddOrUpdateFxRate

public async Task AddOrUpdateFxRate(FxRate fxRateDetails)
        {
            var productsDbContext = this.contextProviderService.CreateProductsDbContext();
            try
            {
                var currencyMapping = await GetCurrencyMapping(fxRateDetails.CurrencyMappingId);
                var destinationCountry = Enum.Parse<Country>(currencyMapping.DestinationCountry, true);
                var fxRate = await GetFxRate(currencyMapping.SourceCurrency, destinationCountry, fxRateDetails.ValidFrom, fxRateDetails.ValidTo);
                if (fxRate == null)
                {
                    productsDbContext.FxRates.Add(fxRateDetails);
                }
                else
                {
                    if (fxRate.ExchangeRate != fxRateDetails.ExchangeRate)
                    {
                        productsDbContext.FxRates.Update(fxRateDetails);
                    }
                    else
                    {
                        fxRateRepoLogging.LogInformation($"ProductRefApi.FxRateRepo: FxRate Already Present{fxRate.Id} ");
                    }
                }

                productsDbContext.Entry(fxRateDetails).State = EntityState.Detached;
                await productsDbContext.SaveChangesAsync();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

, который выбрасывает

System.InvalidOperationException: экземпляр типа сущности «CurrencyMapping» не может быть отслежен, потому что другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается. При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа. Подумайте об использовании DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей.

Может ли кто-нибудь помочь мне решить эту проблему? Любая помощь будет оценена. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...