【发布时间】:2018-07-21 14:13:25
【问题描述】:
我在读取我的 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 日):
我在 ActivityId 属性上添加了 [Key] 注释,这让 EF Core 很高兴并允许我的查询通过。我不需要在 Sql Server 中的表上添加Primary Key 属性,无论如何这在业务逻辑方面都是错误的。但是,我仍然认为 EF Core 应该支持
没有主键的表。就是这么普通的地方。现在所有表都需要有主键。
更新(2018 年 2 月 15 日): 我对这个问题进行了更多研究。正如@Ivan 正确指出的那样,EF Core 团队正在研究 QueryType,它在 EF Core 2.1 中可用,您现在可以从 myget 提要中获取它。但是,我将选择 Dapper Micro ORM,而不是等待发布来获得一些快速行动。根据我阅读的内容,Dapper 快速且易于使用。
【问题讨论】:
-
能提供ef版本吗?我注意到行为或不同版本存在很大差异
-
告诉 EF 密钥是什么...
-
我认为他的数据库没有pk
-
如果它没有主键,那就不是表 - 如何解决这个问题?通过为您的表定义一个主键!无论如何,每个合适的表都应该有一个。
-
据我所知,如果实体
DbSet没有主键,EF 将不会接受它。解决方案是在您的表上定义主键或从上下文类中删除DbSet属性(我不确定这是否可行)。
标签: sql-server entity-framework entity-framework-core primary-key