首先,我已经有了一个解决方法,而且正在替换发生这种情况的数据库(全新的数据库/架构 + 新应用程序)
话虽如此,我想了解为什么会发生这种情况,这样我就不会再遇到它了。感谢您的想法。
无论如何:采用这行简单的代码:
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:
所以我更新了 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/