将类映射到存储过程结果集"值不能为null。参数名称:entityType"

时间:2016-06-17 13:52:52

标签: entity-framework-core

我正在使用Entity Framework 7 RC1 Code First

我有以下代码

var resultset = await _db.Employees.FromSql<Employee>("dbo.sp_GetEmployees @DeptId="+ deptId).ToListAsync();

这样可以正确获取数据。

但是我需要更改存储过程以包含除员工返回之外的其他属性。

因此,我调整存储过程并创建一个自定义类EmployeeQuery,该类继承自Employee并具有其他属性。

然而,FromSql是DbSet

DBContext上的一种方法
 public DbSet<Employee> Employees{ get; set; }

所以我可以通过创建

EmployeeQuery做同样的事情
 public DbSet<EmployeeQuery> EmployeeQueryItems{ get; set; }

和       var resultset = await _db.EmployeeQueryItems.FromSql(&#34; dbo.sp_GetEmployees @DeptId =&#34; + deptId).ToListAsync();

但是创建DBSet属性会告诉Entity Framework在数据库中创建表,它只是一个查询对象。所以我不想做上述事情。

但是显然您可以使用github和此answer

中提到的DbContext设置方法

所以我将代码更改为          var resultset = await _db.Set()。FromSql(&#34; dbo.sp_GetEmployees @DeptId =&#34; + deptId).ToListAsync();

然而,这给了我一个运行时错误

  

ex = {&#34;值不能为空。\ r \ n参数名称:entityType&#34;}

我该如何解决这个问题?

gitbub issue开始,如果不创建虚拟表,它似乎无法实现。

有没有办法告诉EF不创建表格?就像NotMapped上的DbSet属性一样?

1 个答案:

答案 0 :(得分:3)

我自己遇到了这个问题,我能够解决问题的唯一方法就是为POCO映射一个密钥。

在生成的上下文旁边的部分类中,我重写OnModelCreating并添加:

modelBuilder.Entity<ClassName>(entity => entity.HasKey(e => e.Id));

似乎满足EntityFramework。