gpt4 book ai didi

c# - 当标识列不唯一时, Entity Framework 将数据映射错误

转载 作者:行者123 更新时间:2023-11-30 20:21:05 25 4
gpt4 key购买 nike

无需深入探讨“为什么”,只需了解继承的内容以及我必须使用的内容:)

我有一个映射到 View 的 EF6 edmx。上面没有标识列,因此为了让 EF 映射实体,选择第一个非空列作为 PK。这背后的最初想法是只读不会进行更新或删除。没有过滤(ODATA 位于此之上), - 我的意思是仅 - 使用方法是从实体中选择前 N *

View 中有4条记录。

TypeCode | Contact | UserID | LocaleID | EntityName
---------------------------------------------------------
1 6623 1032 9 Jane
1 6623 1032 9 Jane
1 6623 1032 9 John
1 6623 1032 9 John

我看到的问题是 EF 对所有 4 行的映射相同。上面所有的“John”名字都变成了“Jane”

好吧,抛开设计决定,事实上 View 上没有标识记录,为什么 EF 映射最后两行是错误的?我最初的想法是,由于“PK”被设置为 TypeCode 它不知道该怎么做。但是为什么在只从数据库中读取结果时会使用键列呢?我原以为它只对更新和删除有影响

最佳答案

如果您通过 Entity Framework 查询数据,默认行为是每个物化实体都通过其唯一键进行跟踪。唯一键包含您告诉 EF 用作键的任何属性,或者,它被推断为键属性(在您的情况下为 TypeCode)。每当重复的实体键试图进入更改跟踪器时,就会抛出一个错误,告知该对象已被跟踪。

因此 EF 根本无法具体化具有重复主键值的对象。它会损害其跟踪机制。

看来,至少在 EF6 中,AsNoTracking()可以用作解决方法。 AsNoTracking 告诉 EF 只具体化对象而不跟踪它们,因此它不会生成实体键。

明白的是,为什么 EF 在读取重复的主键值时不会抛出异常。现在它会在 SQL 查询结果中遇到它的键值时默默地返回相同的对象多次。这让许多人感到困惑不已。

顺便说一句,避免此问题的常用方法是使用 ROW_NUMBER 为 View 生成临时唯一键值。在 SQL Server 中。这对于只读一次到一个上下文实例中的数据来说已经足够了。

关于c# - 当标识列不唯一时, Entity Framework 将数据映射错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34754366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com