Я пытаюсь отладить проблему в модульном тесте, когда пытаюсь вставить объект в базу данных, используя EF Core 2.1
Это ошибка, с которой я сейчас сталкиваюсь: The instance of entity type 'Element' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked.
И вот код, о котором идет речь:
for (int i = 0; i < command.Element.Count; i++)
{
EditElementRequest elementRequest = command.Element[i];
//Get the ID from the codepath, if there is a codepath
if (elementRequest.CodePath != null)
{
//update existing element entities. This is working
}
else
{
//do some mapping to create the entity. At this point Id is 0
var element = _mapper.Map<Element>(_mapper.Map<CreateElementRequest>(elementRequest));
element.CreatedBy = command.ModifiedBy;
component.Element.Add(element); // Id is still 0
}
}
// at this point the exception is thrown. Component is the parent entity, that is being modified here.
_db.Entry(component).OriginalValues[Constants.BASEAUDITFIELDMODIFIEDBY] = command.ModifiedDate;
Я установил точки останова до того, как element
добавляется в контекст и после, чтобы увидеть, какие элементы отслеживаются в трекере изменений. , Сам юнит-тест заполняет 3 записи. После операции добавления я получаю исключение при выдаче (_db.ChangeTracker.Entries<Element>().ToList())
. Если я повторю команду еще раз, я смогу увидеть 4 записи - что странно для меня.
(_db.ChangeTracker.Entries<Element>().ToList()[0]).Entity.Id //1
(_db.ChangeTracker.Entries<Element>().ToList()[1]).Entity.Id //2
(_db.ChangeTracker.Entries<Element>().ToList()[2]).Entity.Id //3
(_db.ChangeTracker.Entries<Element>().ToList()[3]).Entity.Id //1
Я не понимаю, что происходит и почему. Любая помощь приветствуется.