c# - Entity Framework 的奇怪之处——一列是错误的

标签 c# sql entity-framework

首先,我已经有了一个解决方法,而且正在替换发生这种情况的数据库(全新的数据库/架构 + 新应用程序)

话虽如此,我想了解为什么会发生这种情况,这样我就不会再遇到它了。感谢您的想法。

无论如何:采用这行简单的代码:

var privs = _olddb.tbl_Privileges.Where(x => x.UserID == userFrom);

很简单。基本上,输出的数据示例应该是:

+--------+----------+------------+----------------+------------+
| UserID | RegionID | FacilityID | InitiativeType | AccessType |
+--------+----------+------------+----------------+------------+
|    290 |       27 |        123 | C              | F          |
|    290 |       27 |        123 | P              | F          |
|    290 |       27 |        124 | C              | F          |
|    290 |       27 |        124 | P              | F          |
+--------+----------+------------+----------------+------------+

相反……我明白了:

+--------+----------+------------+----------------+------------+
| UserID | RegionID | FacilityID | InitiativeType | AccessType |
+--------+----------+------------+----------------+------------+
|    290 |       27 |        123 | P              | F          |
|    290 |       27 |        123 | P              | F          |
|    290 |       27 |        124 | P              | F          |
|    290 |       27 |        124 | P              | F          |
+--------+----------+------------+----------------+------------+

注意 InitiativeType 列....

但是,如果我运行这个命令:

var privs =_olddb.Database.SqlQuery<tbl_Privileges>("SELECT * FROM tbl_Privileges WHERE UserID = " + userFrom);

然后我得到正确的输出。

什么给了?

-EDIT- 关于 marc_s 提供的答案 (请记住,我没有参与制作原始数据库,而且我不敢修改它,它被一个非常古老的网络应用程序使用..) 老实说,我为在发布之前没有检查 PK 感到很愚蠢,我很抱歉。我检查了数据库,该表根本没有定义 PK。所以我查看了EF中的edmx,发现只有RegionID和FacilityID设置了Entity Keys:

enter image description here

所以我更新了 edmx 模型并将所有字段设置为键(因为我可以在两个权限集之间轻松地拥有 4 个相同的字段,因为访问类型也有多个值),再次运行脚本,这次成功了与 Linq 语句完美匹配。

最佳答案

很可能,这是源表上主键定义的问题 - 我在查询 View (没有预定义的主键,通常)。

假设您在该表上的 PK 是 (UserID, RegionID, FacilityID)(这只是我的猜测,因为它们都被称为 ..ID - 可能是错误的) .当您从 SQL Server 返回 4 行时,第一行包含值 (290, 27, 123) 作为主键; EF 很乐意为您创建具有这些值(和其他非键列)的对象实例。

现在是第二行 - 同样,PK 值是 (290, 27, 123),现在 EF 变为 hmmmm,我以前见过这些值 - 这一定是又是同一行,因为主键根据定义必须是唯一的!因此,EF 将添加它创建的第一个对象实例的第二个副本。

因此,您需要确保您的主键 - 实际上在数据库中的表上定义,或者 EF 假设 是 View 的主键(默认情况下:所有非-可为空的列)对于每一行来说确实是唯一的 - 否则你会看到这样的事情发生....

第二种方法不会发生这种情况,您基本上只是执行任意 SQL 语句 - 在这种情况下,EF 将映射单独返回的每一行,而不检查它自己的主键定义(因为你并没有真正经历你的 DbContext 和它的数据库模型)

关于c# - Entity Framework 的奇怪之处——一列是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31571196/

相关文章:

c# - 实现 Entity Framework 6 添加或更新方法的最简单方法是什么

c# - EF Code First 中的模型 n--n 关系如何与自动生成的 View 正常工作?

c# - 级联删除不与 EF 级联

c# - 如何更改datagridview中的行颜色

c# - 在 WPF 中的组合框顶部有一个可单击的按钮

sql - SSMS:常用查询列表

mysql - 从单个表中选择统计数据

c# - 提交后如何在后面的代码中重置RadAsyncUpload?

c# - 慢查询 Entity Framework

mysql - SQL 连接不工作(或非常慢)