如何从Entity Framework Core 2.0中没有主键的表中读取?

时间:2018-02-11 06:37:16

标签: sql-server entity-framework entity-framework-core primary-key

我在没有主键的情况下从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快速且易于使用。

1 个答案:

答案 0 :(得分:0)

根据我在过去几天的研究,EF Core的DBSet仅适用于具有Identity或Primary键的表。整个EF Core基于变更跟踪,几乎总是考虑到CRUD,因此密钥是强制性的。对于ad-hoc或只读方案,DBSet不适合。 EF Core团队正在研究DBQuery类型,它应该与没有标识的表/视图一起使用。

对于只读方案,Dapper micro ORM可能更适合,因为它快速且易于使用。