当我从 SQL Server Management Studio 中的 View 中选择时,我有一个来自某个表的 View ,它工作正常,但是当我使用 Entity Framework 从 View 中获取数据时,它是不同的。
ReturnDbForTesEntities1 db = new ReturnDbForTesEntities1();
List<VJOBS2> list = new List<VJOBS2>();
list = db.VJOBS2.ToList();
相同数量的记录,但最后两行不同。
我有求职者表 求职者可以申请 2 个或更多的工作
ApplicantId ApplicantName JobId JobName
1 Mohamed 1 Developer
1 Mohamed 2 IT Supporter
但在列表中
ApplicantId ApplicantName JobId JobName
1 Mohamed 1 Developer
1 Mohamed 1 Developer
最佳答案
从 Entity Framework 使用时,views 有一个微妙的问题。
如果您有一个表,请将它与 EF 一起使用,您需要有一个主键 来唯一标识每一行。通常,这是一个单独的列,例如ID
或类似的东西。
对于 View ,您没有“主键”的概念 - View 仅包含某些表中的某些列。
因此,当 EF 映射 View 时,它找不到主键 - 因此,它将使用 View 中的所有不可为 null 的列作为“替代”主键。
我不知道你的情况是什么 - 你应该能够从 .edmx
模型中分辨出来。
假设 (ApplicantId, ApplicantName)
是 EF 现在用作“替代”主键的两个不可为 null 的列。当 EF 开始读取数据时,它将读取第一行 (1, Mohamed, 1, Developer)
并为此创建一个对象。
当 EF 读取第二行 (1, Mohamed, 2, IT-Supporter)
时,它注意到“主键”(1, Mohamed)
是和以前一样 - 所以它不会费心用读取的那些值创建一个新对象,但是主键是相同的,因此它必须是它之前已经读取过的相同对象,所以它使用那个对象。
所以问题真的是你不能在 View 上有明确的主键。
要么你可以调整你的 EF 模型,让 EF 明白,例如(ApplicantId, JobId)
确实是主键(您需要确保这些列都是不可空) - 或者您需要添加类似“人工”的内容 View 的主键:
CREATE VIEW dbo.VJOBS2
AS
SELECT
ApplicantId, ApplicantName, JobId, JobName,
RowNum = ROW_NUMBER() OVER(ORDER BY JobId)
FROM
dbo.YourBaseTable
通过将这个 RowNum
列添加到您的 View 中,它只是对行 1, 2, ...., n
进行编号,您将获得一个新的、不可为 null 的EF 将包含在“替代 PK”中的列,并且由于这些数字是连续的,所以没有两行具有相同的“PK”值,因此不会错误地替换为已经从数据库中读取的内容。
关于c# - View 和 Entity Framework 数据不对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27164251/