为什么我的一对多字段不会保留在数据库中

问题描述 投票:0回答:1

我正在尝试通过Web服务保存文章时将文件附加到文章。

以下是我的文章的定义:

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();
    }
}

以下是我的Web服务的编码方式:

[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。

我错过了什么?

c# .net-core entity-framework-core
1个回答
1
投票

为了完整起见,我将尝试解释的不仅仅是一行答案。

正如您已经确认的那样,使用_dbContext.Entry(article.MailPictureFile).State = EntityState.Modified;会起作用,因为您告诉DbContext开始在Article中跟踪该对象。

如果您是从传统更新的意义上从ef检索Article对象而不是直接从您的Web服务中检索,那么您就不需要告诉Ef开始跟踪它。

另一种避免错误发生的方法是使用DTO(数据传输对象)的概念,然后将其映射到您从数据库中检索到的对象,就像传统MVC中使用的ViewModels概念一样。那样EF就已经跟踪了它。您还可以获得验证的额外好处并以此方式使用ModelState。

正如Ivan Stoev在评论中所说,使用_dbContext.Update(article);也会奏效。这是更好的,因为根据我的原始建议,它是一行与可能是每个子对象的一行。

© www.soinside.com 2019 - 2024. All rights reserved.