Microsoft Entity Framework Core: невозможно вставить дубликат ключа в объект - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь обновить родительскую сущность, GuildMemberTeam, дочерними сущностями, GuildMember, Team и GuildMemberChallenge, которые также имеют дочерние сущности, GuildMember и Challenge, но получаю следующее внутреннее исключение:

Внутреннее исключение 1: SqlException: нарушение ограничения PRIMARY KEY 'PK_Challenge. Невозможно вставить дубликат ключа в объект 'dbo.Challenge'. Значение дубликата ключа (15ae8798-8567-457b-812a-5820cf7843e5). заявление было прекращено.

Единственным новым объектом является GuildMemberTeam, поскольку все остальные уже существуют, но они проверяются и воссоздаются следующим образом:

public void AddChallenge(Challenge challenge)
{
    if (challenge != null)
    {
        var id = challenge.Id == default(Guid) ? Guid.NewGuid() : challenge.Id;

        Challenge = new Challenge(id, challenge.Name, challenge.Phase, challenge.Type, challenge.Star, challenge.Gear, challenge.Level, challenge.Reward);
    }
}

Это работает для всех других объектов, кроме Challenge, где я получаю ошибку. Может кто-нибудь, пожалуйста, помогите мне понять, что я делаю неправильно.

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Это не меняет того факта, что проблема в том, что вы пытаетесь вставить одну и ту же строку дважды (один и тот же Guid = Id) в таблицу dbo.Challenge.

  1. Это может быть связано с проблемой отладки или чем-то другим.Вы можете удалить строку из таблицы с помощью DELETE FROM [Challenge] WHERE Id = '15ae8798-8567-457b-812a-5820cf7843e5' и попробовать запустить приложение еще раз.

  2. Если это не решит вашу проблему, ваше управление сущностью неисправно и вам придетсяпересмотреть обработку идентификаторов.Реализуйте проверку идентификатора, прежде чем пытаться сохранить свой контекст или что-то в этом роде.

Другая проблема может заключаться в том, что ваши классы не определены должным образом и EF не распознает отношения.Отношения, о которых вы говорите, - это не родитель-ребенок, они либо один-ко-многим, многие-ко-многим, многие-к-одному или ни одного. ОТНОШЕНИЯ С БД

Каждый из ваших POCO должен содержать и экземпляр другого класса, таким образом, вы определяете отношение.Например, если ваш GuildMemberChallenge содержит IEnumerable и свойство с типом вызова.

Если ничего из вышеперечисленного не является решением, мне нужен еще какой-то код (ваши классы, хранилище) для его выяснения.

Обновление: когда вы добавляете новый GuildMemberChallenge, который, я полагаю, вы пытаетесь сделать сейчас.Вы должны установить для его свойства Challenge существующую сущность, если она существует, если вы не можете ее создать, но в данный момент вы пытаетесь создать проблему, которая уже существует в базе данных.

0 голосов
/ 08 марта 2019

Вы создаете новый вызов, но передаете идентификатор существующего вызова, если он установлен.

var id = challenge.Id == default(Guid) ? Guid.NewGuid() : challenge.Id;

Я думаю, что если вы создаете новую сущность, вы всегда должны создавать новый идентификатор

var id = Guid.NewGuid();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...