c# - View 和 Entity Framework 数据不对?

标签 c# entity-framework view

当我从 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/

相关文章:

c# - 需要在 C# 中优先处理异步套接字读取

c# - 在 C# 中使用 Translate Transform 顺时针和逆时针旋转图像

c# - 实体代码优先用户、角色、用户角色表

java - 如何使用不同的延迟参数持续更新textView

android - 如何查看我的 Android 应用程序数据库信息?

c# - 在字符串中查找主题标签

c# - 如何在 C# 中创建字节数组常量?

c# - 导航属性的唯一约束

c# - 薛定谔的物体 : WPF property won't bind/update unless I check its value code-side?

c# - 在 MVC 中将文本与图像居中