【问题标题】:Entity Framework Core 2 with DBQuery - Get Object reference not set to an instance of an object带有 DBQuery 的 Entity Framework Core 2 - 获取未设置为对象实例的对象引用
【发布时间】:2020-03-11 17:58:11
【问题描述】:

我正在使用 Entity Framework Core 2 并尝试了 BDQuery。当我尝试在Select 中映射FromSql() 请求的结果时,出现错误:

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

这是我的 DBContext 类:

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options)
        : base(options) { }

    public DbQuery<MyEntity> MyEntities { get; set; }
}

这是 MyEntity 类的定义:

public class MyEntity
{
    public int Id { get; set;}
}

如果在我的代码中进行以下调用,它可以正常工作(_dbContext 的类型当然是 MyDbContext):

var result = await _dbContext.MyEntities
   .FromSql("Exec MyStoredProc")
   .Select(s => new { s.Id })
   .ToListAsync()

MyStoredProc 返回一个名为 Id 的列。

但是如果我像这样声明一个 MyDTO 类:

public class MyDTO
{
    public int MyId { get; set;}
}

然后像这样拨打电话:

var result = await _dbContext.MyEntities
   .FromSql("Exec MyStoredProc")
   .Select(s => new MyDTO {MyId = s.Id })
   .ToListAsync()

然后引发异常:

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

如果我在 MyDTO 类定义中将字段 MyId 重命名为 Id,它会再次正常工作。

对这种行为有任何想法吗?为什么字段名与SQL列名不映射时会报错?

谢谢

【问题讨论】:

标签: c# entity-framework mapping ef-core-2.1


【解决方案1】:

尝试强制调用 Db。我认为正在发生的事情是实体框架正在尝试编写您的 LINQ 查询,并且它不知道如何映射 MyId,而我们真的希望它进行调用,然后操作内存中的对象。

var result = await _dbContext.MyEntities
   .FromSql("Exec MyStoredProc")
   .AsEnumerable() // <---- Try to force a call to the db. 
   .Select(s => new MyDTO {MyId = s.Id })
   .ToListAsync()

【讨论】:

  • 优秀。它解决了这个问题。但是.ToListAsync() 不存在,我必须使用.ToList()。非常感谢您的快速回答!
猜你喜欢
  • 2021-07-10
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多