检索数据中的“对象引用未设置为对象的实例”

时间:2019-08-03 15:10:56

标签: c# linq entity-framework-core

我试图从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);

在调试时,我可以看到如下所示的值:

enter image description here

这是枚举类的图像 enter image description here 当我按f11键并调试下一行时,它显示了这样的异常: enter image description here

使用 try catch 进行调试时,显示

  

对象引用未设置为对象的实例

这是什么问题?

3 个答案:

答案 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开头)。猜你把它保存错了

想写这个作为评论,但我刚刚创建了这个帐户