[英]Entity Framework oddity - one column is wrong
首先,我已经有一个解决方法,加上正在发生的数据库正在被替换(全新的db / schema +新应用程序)
话虽如此,我想了解为什么会发生这种情况,所以我不会再遇到它。 我们很感激。
无论如何:采取这个简单的代码行:
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被设置为实体密钥:
所以我更新了edmx模型并将所有字段设置为键(因为我可以在两个权限集之间轻松地拥有4个字段,因为Access Type也有多个值),再次运行脚本,这次它与林克声明。
最有可能的是,在源表上定义主键是一个问题 - 我在查询视图时看到了这种情况(通常没有预定义的主键)。
假设你在UserID, RegionID, FacilityID
桌子上的PK是( UserID, RegionID, FacilityID
)(只是我的猜测,因为它们都被称为..ID
- 可能是错误的)。 当您从SQL Server返回4行时,第一行包含值( 290, 27, 123
)作为主键; EF很高兴为您创建具有这些值(以及其他非键列)的对象实例。
现在是第二行 - 再次,PK值是( 290, 27, 123
),现在EF变为嗯,我之前看到过这些值 - 这必须是同一行,因为按照定义主键 必须是唯一的! 因此,EF将添加其创建的第一个对象实例的第二个副本。
所以你需要确保的是你的主键 - 实际上在表中的数据库中定义,或者EF 假设的是视图的主键(默认情况下:所有不可为空的列)对于每一行都是唯一的 -否则你会看到这样的事情......
这种情况不会发生在你的第二种方法中,你基本上只是执行一个任意的SQL语句 - 在这种情况下,EF将映射每个单独返回的行,而不检查它自己的主键定义(因为你没有真正通过你的DbContext
和它的数据库模型)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.