【问题标题】:Entity Framework: View exclusion without primary key实体框架:查看没有主键的排除
【发布时间】:2022-03-15 22:59:52
【问题描述】:

我正在使用 SQL Server,我在其中设计了一个视图来汇总两个表的结果,并且我希望输出是包含结果的单个表。我的查询简化如下:

SELECT SUM(col1), col2, col3
FROM Table1
GROUP BY col2, col3

这为我提供了我想要的数据,但在更新我的 EDM 时,视图被排除在外,因为“无法推断出主键”。

经过一些研究,我修改了查询以欺骗 id 列,如下所示:

SELECT ROW_NUMBER() OVER (ORDER BY col2) AS 'ID', SUM(col1), col2, col3
FROM Table1
GROUP BY col2, col3

这种查询给了我一组很好的增加的 id。但是,当我尝试更新我的模型时,它仍然排除了我的视图,因为它无法推断出主键。我们如何使用聚合记录并将它们与 Linq-to-Entities 连接起来的视图?

【问题讨论】:

  • 如果您正在更新的表/视图没有定义主键,则您无法使用 LINQ 执行插入/更新。它需要一种唯一标识行的方法。
  • 我知道它需要一种唯一标识行的方法。考虑到在表中聚合数据的任务,我该如何完成?
  • @Jim 您在其中一个源表上有一个 id 列吗?如果是这样,您可以尝试MAX(id) as id
  • @qujck 是的,这似乎给了我唯一的 ID。但是,当我更新我的 edmx 时,它仍然给我错误“无法推断主键,排除表”。
  • SELECT ISNULL(MAX(id), 0) as ID, SUM(col1), col2, col3 FROM Table1 GROUP BY col2, col3 这行得通。实体模型能够推断出 ID 作为主键。这有什么缺点吗?

标签: entity-framework linq-to-entities


【解决方案1】:

正如在 cmets 中已经讨论的那样,您可以尝试将 MAX(id) as id 添加到视图中。根据您的反馈,这将变为:

SELECT ISNULL(MAX(id), 0) as ID, 
       SUM(col1), 
       col2, 
       col3 
FROM   Table1 
GROUP BY col2, col3

另一种选择是尝试在视图上创建索引:

CREATE UNIQUE CLUSTERED INDEX idx_view1 ON dbo.View1(id)

【讨论】:

    【解决方案2】:

    我用这个代码改变视图

    ISNULL(ROW_NUMBER() OVER(ORDER BY ActionDate DESC), -1) AS RowID 
    

    我在多关系视图/表查询中使用此子句

    ROW_NUMBER 永远不会给出 null 值,因为它从未见过 -1

    【讨论】:

      【解决方案3】:

      这是我需要添加的所有内容,以便将我的视图导入 EF6。

      select ISNULL(1, 1) keyField
      

      【讨论】:

      • 这和select 1 keyField一样,视图的非唯一键值在EF6中是自找麻烦。
      • 嗨,GERT。如果视图仅用于读取操作,在 EF6 中可能会遇到什么麻烦?
      • this.
      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2011-07-20
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多