通过网络服务保存我的文章时,我试图将文件附加到文章。
这是我的 Article 的定义方式:
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);
}
因此,我要发送一个带有以前创建的 File 的JSON。我只想附上它。然后,我使用具有以下结构的PUT Http请求:
{"id":"39e01ca9-f398-4359-8834-6a8e8400dfeb", "title":"Title", "mainPictureFile":{"id":"503047a3-4244-4299-bc18-1a42b564c2ed","name":"bat.jpg"},"position":0}
所有其他字段均正常运行。只有mainPictureFile丢失。
我想念什么?
答案 0 :(得分:1)
为了完整起见,我将尝试解释的不只是单行答案。
正如您已经确认的那样,使用_dbContext.Entry(article.MailPictureFile).State = EntityState.Modified;
是可行的,因为您要告诉DbContext开始在Article
内跟踪该对象。
如果您从传统更新的意义上从ef而不是直接从Web服务中检索Article
对象,则无需告诉Ef开始跟踪它。
避免错误发生的另一种方法是使用DTO(数据传输对象)的概念,然后将其映射到从数据库中检索到的对象,例如传统MVC中使用的ViewModels概念。这样,EF已经在跟踪它。您还可以获得验证和以这种方式使用ModelState的额外好处。
正如伊万·斯托耶夫(Ivan Stoev)在评论中所说,使用_dbContext.Update(article);
也可以。更好,因为按照我最初的建议,这是一行,而每个子对象可能一行。