我正在使用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在数据库中创建表,它只是一个查询对象。所以我不想做上述事情。
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
属性一样?
答案 0 :(得分:3)
我自己遇到了这个问题,我能够解决问题的唯一方法就是为POCO映射一个密钥。
在生成的上下文旁边的部分类中,我重写OnModelCreating
并添加:
modelBuilder.Entity<ClassName>(entity => entity.HasKey(e => e.Id));
似乎满足EntityFramework。