Entity Framework Core назначает уже существующий первичный ключ при добавлении объекта - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь отладить проблему в модульном тесте, когда пытаюсь вставить объект в базу данных, используя 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

Я не понимаю, что происходит и почему. Любая помощь приветствуется.

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