我正在尝试使用XUnit测试ASP.NET Core Web API控制器。我直接在控制器中使用DBContext。在生产中,我正在使用SqlServer,并且为了进行测试,我正在使用InMemory提供程序。当我测试一些使用EF Core FirstOrDefaultAsync
方法的代码时,应用程序将引发空引用异常。我要查找的值在数据库中不存在。根据我的理解,它应该返回NULL,不应引发异常。
我尝试了类似where(x => x.Id = id).FirstOrDefaultAsync()
之类的方法,它也抛出了相同的null引用异常。
当我尝试类似的东西
var exist = await list.AnyAsync(x => x.Id == id);
if(!exist)
{
return NotFound();
}
var user = await list.FirstAsync(x => x.Id == id);
return user;
有效。 dbcontext和users属性都是值,这些值不为null。
请帮助。
答案 0 :(得分:4)
该异常不是由您的代码引起的。目前,我能够使用最新的EF Core 3.0 Preview 7重现它。它是通过内存提供程序-@StoredProcedureParameter(mode = ParameterMode.IN, name = "p_i_namen_vornamen", type = String.class)
PROCEDURE prüfe_vn_aus_schreiben(p_i_vsnr IN ver.ver_externe_vertragsnummer%TYPE
,p_i_namen_vornamen IN char_table_type
,p_o_found OUT NUMBER
,p_o_percentage OUT NUMBER)
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "prüfe_vn_aus_schreiben",
procedureName = "ICIS.tbsp_automatisierungs_lieferung.prüfe_vn_aus_schreiben",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "p_i_vsnr",
type = String.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "p_i_namen_vornamen",
type = String.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "p_o_found",
type = Float.class),
@StoredProcedureParameter(mode = ParameterMode.OUT, name = "p_o_percentage",
type = Float.class)})
})
和FirstOrDefault[Async]
方法实现的。 SingleOrDefault[Async]
或First[Async]
不会发生。
无论如何,这里的主要问题是您使用的是预览(测试版)软件,该软件可能会出现问题。
只需切换到最新的稳定EF Core 2版本,并等待3.0发行,然后再尝试在生产代码中使用它。