繁体   English   中英

实体框架奇怪 - 一列是错误的

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM