Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的一对多字段不能持久保存在数据库中_C#_.net Core_Entity Framework Core - Fatal编程技术网

C# 为什么我的一对多字段不能持久保存在数据库中

C# 为什么我的一对多字段不能持久保存在数据库中,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,在通过Web服务保存文章时,我试图将文件附加到文章 以下是我的文章的定义: public class Article : BaseEntity { public string Title { get; set; } public File MainPictureFile { get; set; } (....) } 文件模型的定义如下: public class File { public Gu

在通过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);
}
其他所有领域都运转良好。只有主图片文件丢失


我遗漏了什么?

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

如您所确认的,使用_dbContext.Entryarticle.MailPictureFile.State=EntityState.Modified;将起作用,因为您告诉DbContext开始在文章中跟踪该对象

如果按照传统的更新方式从ef检索文章对象,而不是直接从您的Web服务检索文章对象,您就不需要告诉ef开始跟踪它

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


正如Ivan Stoev在使用_dbContext.Updatearticle的评论中所说;也会起作用。这更好,因为根据我最初的建议,它是一行,而可能是每个子对象一行。

这只是一种预感,但我认为这与文件构造函数为文件类的每个实例提供新的guid有关。@ZoharPeled,谢谢,但我在更新文章时没有创建文件。我只想把它贴上。你试过这个吗?你是说文件已经存在了,对吗_dbContext.Entryarticle.MailPictureFile.State=EntityState.Modified;我想你已经证实了它是正确的吗?@Topher,它显然起作用了!!请加上答案,这样我就可以接受了。非常感谢。而不是_dbContext.Entryarticle.State=EntityState.Modified;使用_dbContext.Updatearticle;伟大的谢谢你的解释
{"id":"39e01ca9-f398-4359-8834-6a8e8400dfeb", "title":"Title", "mainPictureFile":{"id":"503047a3-4244-4299-bc18-1a42b564c2ed","name":"bat.jpg"},"position":0}