关于这个主题的许多问题都不符合我的情况。我有一个大型数据模型。在某些情况下,只需要在UI上显示一些字段,因此对于那些我替换了LINQ to 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检索整个实体仍然存在更改,那么在检索字段的子集时,行为方式会有什么样的逻辑?我想知道这是不是一个错误?
答案 0 :(得分:0)
格特是对的,问题是实体没有附加。 Dank U wel,格特! Ik是ervan verbluft! 我只想添加一些细节来展示完整的解决方案。基本上,ObjectContext有一个Attach方法,所以你认为就是这样。但是,当您的Entity SQL select语句列为列,并且您使用Type创建对象时,不会创建EntityKey,并且ObjectContext.Attach会失败。在尝试并且未能插入我自己创建的EntityKey之后,我偶然发现了EntSet 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;