2

关于这个主题的许多问题似乎都不符合我的情况。我有一个大数据模型。在某些情况下,只需要在 UI 上显示几个字段,因此对于那些我替换了 LINQ to Entity 查询,该查询使用 Entity SQL 查询提取所有内容,只检索所需的列,使用 Type 构造函数,以便我得到返回的实体而不是 DbDataRecord,如下所示:

SELECT VALUE MyModelNameSpace.INCIDENT(incident.FieldA, incident.FieldB, ...) FROM ... AS ...

这有效并在 UI 中显示字段。如果我进行更改,当我退出 UI 元素时,更改会返回到实体模型。但是当我执行 SaveChanges 时,更改不会持久保存到数据库中。日志中没有显示错误。现在,如果我非常小心地将上述查询替换为检索整个实体的 Entity Sql 查询,如下所示:

SELECT VALUE incident FROM MyDB.INCIDENTs AS incident...

更改确实会保存在数据库中!因此,作为测试,我创建了另一个查询,如第一个查询,命名实体中的每一列,它应该与第二个实体 SQL 查询完全等效。然而,它也没有持久化对数据库的更改。

我尝试将返回结果上的 MergeOption 设置为 PreserveChanges,以开始跟踪,如下所示:

incidents.MergeOption = MergeOption.PreserveChanges;

但这没有任何效果。但实际上,如果使用 Entity Sql 检索整个实体会持续更改,那么在检索字段子集时表现不同的逻辑目的是什么?我想知道这是否是一个错误?

4

1 回答 1

0

Gert 是正确的,问题是实体没有附加。你好,格特!Ik 是 ervan 胡说八道! 我只是想添加一些细节来展示完整的解决方案。基本上,ObjectContext 有一个 Attach 方法,所以你会认为就是这样。但是,当您的 Entity SQL 选择语句命名列,并且您像我一样使用 Type 创建对象时,不会创建 EntityKey,并且 ObjectContext.Attach 失败。在尝试插入我自己创建的 EntityKey 但失败后,我偶然发现了在 Entity Framework 4 中添加的 ObjectSet.Attach。它不会失败,而是会在缺少 EntityKey 时创建它。不错的触感。

代码是(这可能可以用更少的步骤完成,但我知道这是可行的):

var QueryString = "SELECT VALUE RunTimeUIDesigner.INCIDENT  (incident.INCIDENT_NBR,incident.LOCATION,etc"
ObjectQuery<INCIDENT> incidents = orbcadDB.CreateQuery<INCIDENT>(QueryString);
incidents.MergeOption = MergeOption.PreserveChanges;
List<INCIDENT> retrievedIncidents = incidents.ToList<INCIDENT>();
orbcadDB.INCIDENTs.Attach(retrievedIncidents[0]);
iNCIDENTsViewSource.Source = retrievedIncidents;
于 2012-09-20T02:14:48.280 回答