Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检索数据时“对象引用未设置为对象的实例”_C#_Linq_Entity Framework Core - Fatal编程技术网

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

C# 检索数据时“对象引用未设置为对象的实例”,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,我已尝试从SQL数据库检索数据。我使用的是实体框架核心。它从数据库中检索所需的数据。我可以在调试时看到数据,但是数据没有分配给变量类型的变量。FYI,变量类型的值是0,它基本上是一个枚举,我将其类型转换为int。下面是代码 public async Task<string> GetMailTemplateByType(Models.TemplateTypes type) { var mailTemplate = await _userDbContext.Mai

我已尝试从SQL数据库检索数据。我使用的是实体框架核心。它从数据库中检索所需的数据。我可以在调试时看到数据,但是数据没有分配给变量类型的变量。FYI,变量类型的值是0,它基本上是一个枚举,我将其类型转换为int。下面是代码

public async Task<string> GetMailTemplateByType(Models.TemplateTypes type)
    {
        var mailTemplate = await _userDbContext.MailTemplates.FirstOrDefaultAsync(mt => mt.TemplateType==((int)type));
        return mailTemplate.MailHtml;
    }
使用try-catch进行调试时,会显示

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

这里有什么问题

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");
}

看起来您正在尝试接收不存在的数据

我们可以从您的代码中看到,您收到了以下邮件模板对象: Id={aeced541-7003-437e-8f77-4605766fb62c}; MailHtml=您好,非常感谢您的注册。这里是进一步进行的确认链接。。。; TemplateType=0

这里您正在传递一些我们不知道的TemplateType值

public async Task<string> GetMailTemplateByType(Models.TemplateTypes type)
{

但是如果type不是0,它将不会返回MailTemplate对象,因为我们在调试器窗口中看到的MailTemplate对象的TemplateType值为0,因此FirstOrDefaultAsync将返回null值,请参见为什么选择整个对象?ef core就像sql一样,在您的案例中选择您需要的,只需执行以下操作

var mailTemplate = await _userDbContext.MailTemplates.Where(mt => mt.TemplateType==((int)type)).Select(x => x.MailHtml).FirstOrDefaultAsync();
但这仍然不起作用,因为您的实体表示TemplateType为0,而您的枚举以1开头。我猜你把它存错了


希望将此作为注释写入,但我刚刚创建了此帐户

您可以先检查mailTemplate的值。除非您的inttype在上面的示例中等于0,否则它不会返回您在调试中显示的mailTemplate您确定收到了任何数据吗?若linq找不到感兴趣的数据,若字符串为null,它将以null响应。。它是空的。您应该检查mailTemplate是否为空,请尝试{…}catchNullReferenceException err{Console.Writelineerr.Message;}如果它显示相同,则您只是捕获了空异常,这确实意味着您试图查找不存在的内容。是,mailTemplate为null,但我可以看到数据库中的数据,如第一个屏幕截图中可能重复的“是”,您看到的值来自数据库,该数据库为mt.TemplateType,值为0。本地值类型也是0,但它是一个枚举,因此我将其类型转换为int。您是否可以提供MailTemplate对象和TemplateTypes枚举的定义,以便更好地理解比较可能失败的原因?@NishanthPrabhakaran根据您的枚举定义,您只有一个枚举值,即Activation=1,当0不是TemplateTypes的有效值时,如何将值0传递给GetMailTemplateByTypeModels.TemplateTypes type您需要将枚举中的激活更改为0,或者将数据库中的TemplateType更新为1,以便它们匹配我可以看到数据填充,如第一个屏幕截图所示。FirstOrDefaultAsync.public async任务中是否有任何问题,但我不明白,但是您希望从该方法返回什么?自己的类型,还是字符串类型?我知道,如果它的任务需要字符串,那么对于这样的异常,它是修复的,您需要使用它来建立您想要返回的内容。你能给我看看你的实体吗?我有答案了,谢谢
var mailTemplate = await _userDbContext.MailTemplates.FirstOrDefaultAsync(mt => mt.TemplateType==((int)type));
var mailTemplate = await _userDbContext.MailTemplates.Where(mt => mt.TemplateType==((int)type)).Select(x => x.MailHtml).FirstOrDefaultAsync();