Привет Недавно я обновил свой. 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, чтобы увидеть конфликтующие значения ключей.
Может ли кто-нибудь помочь мне решить эту проблему? Любая помощь будет оценена. Спасибо