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

13

我正在使用ASP.NET Core 2.2来开发Web API。在我的存储库类中,我有以下方法:

public async Task<Articles> AddAsync(Articles article)
{
   return await _context.Articles.AddAsync(article);
}

我遇到了以下错误:

Cannot implicitly convert type 'Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry<Author.Command.Persistence.DBContextAggregate.Articles>' to 'Author.Command.Persistence.DBContextAggregate.Articles'

我正在尝试使用AddAsync版本来保存数据。

有人能帮助我提供指导以解决这个问题吗?


我认为你没有提供足够的代码来确定问题。请向我们展示相关的代码和完整的堆栈跟踪 - Robert Harvey
只要“Articles”类只是一个普通的模型,那就足够了。@RobertHarvey - Twenty
1个回答

18

AddAsync方法不仅返回提供的类型,例如Articles,而是返回Task<EntityEntry>。要解决您的问题,请将代码更改为以下内容。

public async Task<Articles> AddAsync(Articles article)
{
   await _context.Articles.AddAsync(article);
   return article;
}
修改后的文章实例将会持久存在,因为EFCore将会跟踪所提供的实体。 请查看MSDN 获取更多信息。
基本上现在发生的是将您的Articles实例添加到DBContext的DBSet中。如果主键为您生成,则它实际上会在您提供的AddAsync方法中设置它。
编辑: 正如从文档中Chris Pratt所述 此方法仅为异步,以允许特殊值生成器(例如'Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo'使用的值生成器)以异步方式访问数据库。对于所有其他情况,请使用非异步方法。
因此,您应该改用同步版本的Add。 因此,代码应该类似于这样。
public Articles Add(Articles article)
{
   _context.Articles.Add(article);
   return article;
}

任务为什么没有显示在堆栈跟踪中? - Robert Harvey
@RobertHarvey 我非常确定这是由于 await 关键字引起的。 - Twenty
@santoshkumarpatro:是的,这就是你在原帖中所说的。 - Robert Harvey
2
顺便提一下,你不应该实际使用 AddAsync。从文档中可以看到:“此方法仅为异步,以允许特殊值生成器(例如“Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.SequenceHiLo”使用的值生成器)异步访问数据库。对于所有其他情况,应使用非异步方法。”请改用 Add - Chris Pratt
@ChrisPratt 感谢您指出这一点,我已经更新了我的答案。 - Twenty
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接