【问题标题】:Getting wrong data from SQL view when putting it into a C# list将 SQL 视图放入 C# 列表时从 SQL 视图中获取错误数据
【发布时间】:2022-01-17 17:36:58
【问题描述】:

我有一个想要使用的 SQL 视图,并将其放入 ASP.NET MVC 项目的 C# 列表中,以便我可以对该列表执行查询。问题是我从视图中得到了错误的数据。

当我尝试从 SQL 视图中获取所有数据时,计数是正确的,但有些行显示了多次,有些行就消失了。当我尝试对该视图中的数据执行一些逻辑时,也会发生同样的事情。

[HttpGet]
[Route("Home/Testing/{godina}/{istorija}/{decursus_id}/{therapy_id}")]
public ActionResult Testing(string godina, string istorija, int decursus_id, string therapy_id)
{
    List<v_as_stac_terapija_komercijalni> terapijaKomercijalniList = db.v_as_stac_terapija_komercijalni
        .Where(x => x.godina == godina
                    && x.istorija == istorija
                    && x.decursus_id == decursus_id
                    && x.therapy_id == therapy_id)
        .ToList();

    return View();
}

所以根据我的 SQL 视图中的数据和根据此操作中给出的参数,列表应该包含 3 个结果,计数为 3,但问题是我总是得到与此参数匹配的第一条记录 3 次,而不是获取真正的 3 条记录。

如有必要,我可以提供更多信息。谢谢

【问题讨论】:

  • 可能您的实体的 PrimaryKey 错误。
  • 首先:这是什么RDBMS?请添加相关标签!
  • 第二:对来自 RDBMS 的视图使用 EF(我相信你是这样的)可能会很棘手。您的视图是否包含用于创建视图结果集的所有表的主键?如果不是 - 您可能会在读取数据时从 EF 获得 错误读数
  • 我使用 Microsoft SQL Server 2012。由于它是一个 sql 视图,并且它保存来自 5 个不同表的数据,因此它本身没有主键,因此其中一个中的主键存在问题生成此视图的表?
  • 尝试AsNoTracking 或将您的实体定义为HasNoKey

标签: c# sql-server asp.net-mvc linq


【解决方案1】:

您并没有真正告诉我们您正在使用什么 RDBMS,我们也不知道视图是什么样的以及它可能会查询哪些基础表以获取其结果集。

根据我自己的个人经验,我知道在 EF 中使用视图中的数据可能有点棘手。可能,问题只是缺少明确的主键。数据库中的每个表都应该有一个适当的、定义良好的主键。

这里发生的情况是:由于没有主键,EF 只会使用视图中的所有不可为空的列作为“替换”PK。

而EF读取数据的时候会去:

  • 读取行
  • 检查主键(或本例中的“替代”PK)
  • 如果它已经读取一行包含该 PK - 它只是复制它已经拥有的那一行 - 它会忽略视图中的任何非 PK 列!

因此,在您的情况下,一旦它使用“替代”PK 读取了第一行,具有这些值的任何其他行都将获得已经读取的值 - 无论数据库中存储了什么!

解决方案:正如我之前所说:每个表都应该有一个适当的主键来唯一标识每一行 - 在您的视图定义中,您应该包括 all将视图定义到该视图的结果集中所涉及的所有表中的主键列。有了这个,EF 有望自动选择 右列 作为其“临时”主键,并实际读取您视图中从 RDBMS 返回的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2011-02-13
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多