无法将类型'Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry <T>'隐式转换为'T'

san*_*tro 2 c# entity-framework-core asp.net-core-2.2

我正在使用ASP.NET core 2.2开发Web api。我在存储库类中具有以下方法:

public async Task<Articles> AddAsync(Articles article)
{
   return await _context.Articles.AddAsync(article);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Cannot implicitly convert type 'Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<Author.Command.Persistence.DBContextAggregate.Articles>' to 'Author.Command.Persistence.DBContextAggregate.Articles'
Run Code Online (Sandbox Code Playgroud)

在这里,我试图使用AddAsync版本来保存数据。

谁能帮助我提供解决此问题的指导?

Twe*_*nty 5

AddAsync在您的情况下,该方法不只返回提供的类型Articles。它确实返回Task<EntityEntry>。要解决您的问题,请将代码更改为以下内容。

public async Task<Articles> AddAsync(Articles article)
{
   await _context.Articles.AddAsync(article);
   return article;
}
Run Code Online (Sandbox Code Playgroud)

由于EFCore会跟踪提供的Entity,因此对项目实例所做的更改将继续存在。有关更多信息,请参见MSDN

现在基本上会发生的是将您的Articles实例添加到DBContext的DBSet中。如果为您生成了主键,它将实际上在您提供的AddAsync方法的实例中进行设置。

编辑

Chris Pratt文档所述

Blockquotehis方法是异步的,仅允许特殊值生成器(例如“ Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo”使用的生成器)异步访问数据库。对于所有其他情况,应使用非异步方法。

因此,您应该改为使用同步版本Add

因此,代码应如下所示。

public Articles Add(Articles article)
{
   _context.Articles.Add(article);
   return article;
}
Run Code Online (Sandbox Code Playgroud)

  • FWIW,您不应该实际使用“AddAsync”。从文档中:“此方法是异步的,仅允许特殊值生成器(例如“Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo”使用的生成器)异步访问数据库。对于所有其他情况,非异步方法应该是用过的。” 请改用“添加”。 (2认同)