ASP.NET API выдает ошибку Entity Framework - PullRequest
0 голосов
/ 23 мая 2018

Ниже приведен код моего API, но он всегда возвращает 500 Внутренняя ошибка сервера.Исключение выдается при выполнении SaveChangesAsync().

Экземпляр типа объекта «NewsReport» не может быть отслежен, поскольку другой экземпляр с таким же значением ключа для {'Id'} уже отслеживается.При подключении существующих объектов убедитесь, что подключен только один экземпляр объекта с данным значением ключа.Подумайте об использовании DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие ключевые значения

[HttpPut("{id}")]
public async Task<IActionResult> EditDevblog([FromBody] DevblogModel devblog, int id)
{
    if (!ModelState.IsValid)
        return BadRequest();

    var devblogInDb = _context.DevblogModels
        .Include(d => d.Fixs)
        .Include(d => d.News)
        .Include(d => d.Removes)
        .Include(d => d.Updates)
        .SingleOrDefault(d => d.Id == id);

    if (devblogInDb == null)
        return NotFound();

    devblogInDb.Fixs = devblog.Fixs;
    devblogInDb.News = devblog.News;
    devblogInDb.Removes = devblog.Removes;
    devblogInDb.Updates = devblog.Updates;
    devblogInDb.PatchName = devblog.PatchName;

    await _context.SaveChangesAsync();
    var h = _context.DevblogModels.SingleOrDefault(d => d.Id == id);
    return Ok();
}

1 Ответ

0 голосов
/ 23 мая 2018

Пожалуйста, смотрите мой ответ здесь .

EF Core выдает это исключение, когда вы заменяете экземпляр дочернего объекта новым, как вы делаете здесь:

devblogInDb.Fixs = devblog.Fixs;
devblogInDb.News = devblog.News;
devblogInDb.Removes = devblog.Removes;
devblogInDb.Updates = devblog.Updates;
devblogInDb.PatchName = devblog.PatchName;

К сожалению, единственной работоспособной альтернативой было обновление текущего дочернего объектасвойства напрямую.Согласно моему первоначальному ответу:

// In your DevblogModels and assuming a 1:1 relationship
public void SetNewsReport(NewsReport newsReport)
{   
    this.News.UpdateFrom(newsReport);
}

// Then, on your NewsReport entity
internal void UpdateFrom(NewsReport other)
{
    this.Title = other.Title;
    this.Article = other.Article;
    // other properties...
}

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

context.Entry(devblogInDb).State = EntityState.Detached;
devblogInDb.Fixs = devblog.Fixs;
devblogInDb.News = devblog.News;
devblogInDb.Removes = devblog.Removes;
devblogInDb.Updates = devblog.Updates;
devblogInDb.PatchName = devblog.PatchName;
context.Entry(devblogInDb).State = EntityState.Modified;

Чуть дальше

Поскольку мой первоначальный ответ предполагает, что это давняя проблемас EF Core.Предполагалось, что эта проблема будет исправлена ​​в EF Core 2.1, однако OP моего первоначального ответа использовал кандидат на выпуск для EF Core 2.1.Видимо, из-за этой проблемы либо не было исправления, либо внесенные исправления все еще содержат несколько ошибок (в конце концов, это всего лишь кандидат на релиз ...)

Для отличного прочтения по этой теме, ДжулиЛерман опубликовал статью в журнале MSDN, которую вы можете найти здесь .У нее также есть несколько альтернативных решений, которые вы также можете использовать.

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