Ошибка проверки для одного или нескольких объектов - PullRequest
1 голос
/ 04 октября 2019

Это действительно одна из самых странных проблем, с которыми я столкнулся.

У меня есть веб-API, который использует EF. У меня есть таблица аудита, которая принимает ApplicationUser. Я создаю новый объект, добавляю его в коллекцию и затем вызываю SaveChangesAsync (). Странная часть, я получаю «Имя пользователя MyUserName уже занято». ошибка.

using (var context = new ApplicationDbContext())
{
    var user = context.Users.Single<ApplicationUser>(x => x.UserName == model.UserName);

    var sid = context.SessionIds.FirstOrDefault(x => x.Id == model.SessionId);

    var audit = new Audit
    {
        Data = model.Data,
        User = user,
        IpAddress = Helper.GetClientIp(Request),
        Session = sid != null ? sid : ItsMyChance.Entities.Entities.SessionId.Create(scoreModel.UserName, scoreModel.GameId)
    };

    context.Audits.Add(audit);
    await context.SaveChangesAsync();
}

Обновление

Этот код работает годами. Разница в том, что я обновляюсь с .NET 4.5 до .NET 4.61

Обновление 2

Я также попробовал следующее, но все еще получаю ту же ошибку

    [ForeignKey("User")]
    public string UserId { get; set; }

    public ApplicationUser User { get; set; }

Обновление 3

Пытаясь отследить эту проблему, я вызываю

var entries = context.ChangeTracker.Entries();

Возвращает несколько записей, по 1 для каждого объекта, включая пользователя. Пользователь показывает Добавлено и еще одно как Без изменений. Я не могу понять, как это происходит.

Кроме того, я добавил следующее, прежде чем вносить какие-либо изменения, но эффекта нет.

context.Configuration.AutoDetectChangesEnabled = false;

1 Ответ

0 голосов
/ 04 октября 2019

Поскольку вы добавляете полный пользовательский объект в Audit, SaveChangesAsync также сохранит новую запись для Audit и User, а так как пользователь с таким же именем пользователя уже существует, поэтому вы получаете эту ошибку. Что вам нужно сделать, это просто назначить только UserId (какой бы ни был ссылочный ключ в таблице Audit для пользователя) в объекте Audit

var audit = new Audit
    {
        Data = model.Data,
        UserId = user.Id,
        IpAddress = Helper.GetClientIp(Request),
        Session = sid != null ? sid : ItsMyChance.Entities.Entities.SessionId.Create(scoreModel.UserName, scoreModel.GameId)
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...