тип 'Entity' не может быть отслежен, потому что другой экземпляр с тем же значением ключа для {'Id'} уже отслеживается, разрешено при обновлении Entity - PullRequest
0 голосов
/ 15 декабря 2018

То, с чем я сталкиваюсь, похоже на большинство людей, имеющих проблемы с вышеуказанной проблемой.В одном потоке, который я посмотрел, решение было довольно простым: использовать тот же экземпляр контекста, добавить и утвердить и поместить SUT под зонтик.Примерно так:

        //Act
        using (var actContext = new ItsAllAboutTheGameDbContext(contextOptions))
        {
            await actContext.Users.AddAsync(user);
            await actContext.Wallets.AddAsync(userWallet);
            await actContext.CreditCards.AddAsync(creditCard);
            await actContext.SaveChangesAsync();
            var sut = new TransactionService(actContext, walletServiceMock.Object,
                userServiceMock.Object, foreignExchangeServiceMock.Object, cardServiceMock.Object, dateTimeProvider);
            var transactionDTO = await sut.MakeDeposit(user, creditCard.Id, amount);

            Assert.IsInstanceOfType(transactionDTO, typeof(TransactionDTO));
        }

Что ж, это не дает мне хорошего ответа, потому что это обычно не так, поскольку мы используем одинаковые параметры контекста для всех экземпляров, как здесь:

//Act
        using (var actContext = new ItsAllAboutTheGameDbContext(contextOptions))
        {
            await actContext.Users.AddAsync(user);
            await actContext.Wallets.AddAsync(userWallet);
            await actContext.CreditCards.AddAsync(creditCard);
            await actContext.SaveChangesAsync();
        }

        //Assert
        using (var assertContext = new ItsAllAboutTheGameDbContext(contextOptions))
        {
            var sut = new TransactionService(assertContext, walletServiceMock.Object,
                userServiceMock.Object, foreignExchangeServiceMock.Object, cardServiceMock.Object, dateTimeProvider);
            assertContext.CreditCards.Update(creditCard);
            var transactionDTO = await sut.MakeDeposit(user, creditCard.Id, amount);

            Assert.IsInstanceOfType(transactionDTO, typeof(TransactionDTO));
        }

Но это не работает!Выкидывает вышеупомянутое в теме исключение!Сущность добавляется 2 раза (да, копия того же самого).Единственное странное решение, с которым я столкнулся только сейчас, - это обновить сущность (CreditCard), прежде чем переходить к тестируемой системе.Примерно так:

assertContext.CreditCards.Update(creditCard);
            var transactionDTO = await sut.MakeDeposit(user, creditCard.Id, amount);

Благодаря обновлению, каким-то образом отслеживание помогает, я полагаю.То, что мне нужно прочитать больше документации по Entity Framework или другим фреймворкам, это одно, может кто-нибудь дать мне довольно простой ответ на вопрос, почему в обоих случаях это работает, какой из них предпочтителен, если какой-либо из них на самом деле, и если естьрешение для исключения без выполнения одного из обоих, что бы это было?Заранее спасибо!

Обновление

Я заметил, что когда я даже начинаю каким-либо образом отслеживать объект, например, присоединяю его, так как не хочу, чтобы он былмодифицировано любым нежелательным образом, это работает!Итак, я думаю, что поскольку Update отслеживает одним способом заданную сущность, а Attach - другим, я думаю, что сущность не отслеживалась с самого начала.Несмотря на то, что TrackBehaviour для всех должно быть установлено в true ... Мне действительно нужно некоторое подтверждение, чтобы мы могли либо закрыть эту ветку, либо пометить мой ответ как true

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