Почему мое поле «один ко многим» не сохраняется в базе данных - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь прикрепить файл к статье при сохранении моей статьи через веб-сервис.

Вот как моя статья определяется:

public class Article : BaseEntity
{
    public string Title
    {
        get; set;
    }

    public File MainPictureFile
    {
        get; set;
    }

    (....)
}

Модель Файл определяется следующим образом:

public class File
{
    public Guid ID { get; set; }

    public string Name
    {
        get; set;
    }

    public File()
    {
        ID = Guid.NewGuid();
    }
}

Вот как кодируется моя веб-служба:

[HttpPut]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary), StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesDefaultResponseType]
public async Task<ActionResult<Article>> PutArticle([FromBody] Article article)
{
    _dbContext.Entry(article).State = EntityState.Modified;
    try
    {
        await _dbContext.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!ArticleExists(article.ID))
        {
            return NotFound();
        }
        {
            throw;
        }
    }
    return Ok(article);
}

Итак, я отправляю JSON с файлом , уже созданным ранее.Я просто хочу прикрепить это.Затем я использую запрос PUT Http со структурой, подобной этой:

{"id":"39e01ca9-f398-4359-8834-6a8e8400dfeb", "title":"Title", "mainPictureFile":{"id":"503047a3-4244-4299-bc18-1a42b564c2ed","name":"bat.jpg"},"position":0}

Все остальные поля работают отлично.Отсутствует только mainPictureFile.

Чего мне не хватает?

1 Ответ

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

Ради полноты я попытаюсь объяснить больше, чем просто однострочный ответ.

Как вы подтвердили, использование _dbContext.Entry(article.MailPictureFile).State = EntityState.Modified; будет работать, потому что вы говорите DbContext:начните отслеживать этот объект в пределах Article.

Если вы извлекали этот объект Article из ef в смысле традиционного обновления, а не непосредственно из вашего веб-сервиса, вам не нужно было бы указывать Efчтобы начать его отслеживание.

Еще один способ избежать этого по ошибке - использовать концепцию DTO (объект передачи данных), который затем сопоставляется с объектом, который вы извлекли из базы данных, например, концепцияViewModels используется в традиционных MVC.Таким образом, EF уже отслеживает это.Вы также получаете дополнительное преимущество проверок и использования ModelState таким образом.

Как говорит Иван Стоев в комментариях, использование _dbContext.Update(article); также будет работать.что лучше, потому что это одна строка против потенциально строки на подобъект согласно моему первоначальному предложению.

...