我试图从SQL数据库检索数据。我正在使用实体框架核心。它从数据库中检索所需的数据。我可以看到调试时出现了数据,但没有将数据分配给 var 类型的变量。仅供参考,变量 type 的值为 0 ,基本上是枚举,我将其强制转换为 int 。下面是代码
public async Task<string> GetMailTemplateByType(Models.TemplateTypes type)
{
var mailTemplate = await _userDbContext.MailTemplates.FirstOrDefaultAsync(mt => mt.TemplateType==((int)type));
return mailTemplate.MailHtml;
}
这是定义:
var HtmlTemplate = await _coreDataManager.GetMailTemplateByType(TemplateTypes.Activation);
在调试时,我可以看到如下所示的值:
这是枚举类的图像
当我按f11键并调试下一行时,它显示了这样的异常:
使用 try catch 进行调试时,显示
对象引用未设置为对象的实例
这是什么问题?
答案 0 :(得分:2)
public async Task<string> GetMailTemplateByType(Models.TemplateTypes type)
{
var mailTemplate = /*your expression from screenshot*/.FirstOrDefault();
if(mailTemplate = null)
throw new NullReferenceException();
return mailTemplate;
}
..........................
try
{
GetMailTemplateByType(TemplateTypesVariable);
}
catch(NullReferenceException err)
{
Console.WriteLine("template does not exist");
}
您似乎正在尝试接收不存在的数据。
答案 1 :(得分:2)
我们可以从您的代码中看到您已经收到以下邮件模板对象:
ID = {aeced541-7003-437e-8f77-4605766fb62c};
MailHtml =“嗨,
非常感谢您注册。这里是“确认”链接,可以继续进行操作...”;
TemplateType = 0;
这里您正在传递一些我们不知道的TemplateType值
public async Task<string> GetMailTemplateByType(Models.TemplateTypes type)
{
在这里,您将该类型值与我们在dubugger窗口中看到的MailTemplate对象中的TemplateType属性进行比较
var mailTemplate = await _userDbContext.MailTemplates.FirstOrDefaultAsync(mt => mt.TemplateType==((int)type));
但是,如果type不为0,它将不会返回MailTemplate对象,因为我们在调试器窗口中看到的MailTemplate对象的TemplateType值为0,因此FirstOrDefaultAsync将返回空值,请参见"fault returns NullReferenceException if no match is found" >
答案 2 :(得分:1)
为什么还要选择整个对象? ef-core就像sql一样,选择所需的内容(在您的情况下,只需执行
var mailTemplate = await _userDbContext.MailTemplates.Where(mt => mt.TemplateType==((int)type)).Select(x => x.MailHtml).FirstOrDefaultAsync();
,但这仍然不起作用,因为您的实体说TemplateType为0(并且您的枚举以1开头)。猜你把它保存错了
想写这个作为评论,但我刚刚创建了这个帐户