【问题标题】:How to read from a table without a primary key in Entity Framework Core 2.0?如何在 Entity Framework Core 2.0 中读取没有主键的表?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2015-08-21
    • 2018-09-03
    • 2018-06-19
    • 2022-09-27
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多