我在没有主键的情况下从SQL Server中的表读取时遇到问题。我已经定义了一个实体类,例如:
public class PerfData
{
public Int64 ActivityId { get; set; }
public Int64 Numbers{ get; set; }
}
DbContext
类,例如
class MyDBContext
{
public DbSet<PerfData> {get; set;}
}
实体类型记录每个人执行的ActivityId
的数字,因此SQL Server表上没有定义主键。但是,当我使用以下代码检索数据时,EF Core会抱怨实体类型PerfData
需要定义主键:
dBContext.AdPerfData.FromSql(@"select [ActivityId], [Numbers]
from PerfTable").AsNoTracking().ToList();
如何解决这个限制?该表包含用于读取的数据,我不需要从我的代码中插入,更新或删除。
更新(2018年2月11日):
我在[Key]
属性上添加了ActivityId
注释,这使得EF Core很高兴并允许我的查询通过。我不需要在Sql Server的表上添加Primary Key
属性,无论如何这在业务逻辑方面都是错误的。但是,我仍然认为EF Core应该支持
没有主键的表。这就是这样一个普通的地方。现在所有表都需要主键。
更新(2018年2月15日): 我对此问题进行了更多研究。正如@Ivan正确指出的那样,EF Core团队正在研究QueryType,它可以在EF Core 2.1中使用,你可以从myget feed获得它。但是,我将选择Dapper Micro ORM而不是等待发布以获得一些快速操作。根据我的阅读,Dapper快速且易于使用。
答案 0 :(得分:0)
根据我在过去几天的研究,EF Core的DBSet仅适用于具有Identity或Primary键的表。整个EF Core基于变更跟踪,几乎总是考虑到CRUD,因此密钥是强制性的。对于ad-hoc或只读方案,DBSet不适合。 EF Core团队正在研究DBQuery类型,它应该与没有标识的表/视图一起使用。
对于只读方案,Dapper micro ORM可能更适合,因为它快速且易于使用。