Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架5保存更改不工作,无错误_Entity Framework_Entity Framework 5_Entity Sql - Fatal编程技术网

Entity framework 实体框架5保存更改不工作,无错误

Entity framework 实体框架5保存更改不工作,无错误,entity-framework,entity-framework-5,entity-sql,Entity Framework,Entity Framework 5,Entity Sql,关于这个话题的许多问题似乎都不符合我的情况。我有一个大数据模型。在某些情况下,UI上只需要显示少数字段,因此对于那些我使用类型构造函数将LINQ to Entity查询替换为只检索所需列的实体SQL查询,从而返回实体而不是DbDataRecord,如下所示: SELECT VALUE MyModelNameSpace.INCIDENT(incident.FieldA, incident.FieldB, ...) FROM ... AS ... 这将在UI中工作并显示字段。如果我做了更改,当我从

关于这个话题的许多问题似乎都不符合我的情况。我有一个大数据模型。在某些情况下,UI上只需要显示少数字段,因此对于那些我使用类型构造函数将LINQ to Entity查询替换为只检索所需列的实体SQL查询,从而返回实体而不是DbDataRecord,如下所示:

SELECT VALUE MyModelNameSpace.INCIDENT(incident.FieldA, incident.FieldB, ...) FROM ... AS ...
这将在UI中工作并显示字段。如果我做了更改,当我从UI元素中取出选项卡时,更改会使其返回到实体模型。但是,当我执行SaveChanges时,这些更改不会持久化到数据库中。日志中未显示任何错误。现在,如果我非常小心地将上述查询替换为检索整个实体的实体Sql查询,如下所示:

SELECT VALUE incident FROM MyDB.INCIDENTs AS incident...
incidents.MergeOption = MergeOption.PreserveChanges;
更改会在数据库中持久化!作为测试,我创建了另一个查询,如第一个查询,它命名实体中的每一列,这应该与第二个实体SQL查询完全等效。但它也没有将更改持久化到数据库中

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

SELECT VALUE incident FROM MyDB.INCIDENTs AS incident...
incidents.MergeOption = MergeOption.PreserveChanges;

但这没有效果。但实际上,如果使用实体Sql检索整个实体的情况持续发生变化,那么在检索字段的子集时,有什么逻辑目的可以改变行为?我想知道这是否是一个bug?

Gert是正确的,问题是实体没有连接。好的,格特!伊克是一个爱唠叨的人! 我只是想添加一点细节来展示完整的解决方案。基本上,ObjectContext有一个Attach方法,所以您可能会认为就是它。但是,当您的实体SQL select语句命名列,并且像我一样使用类型创建对象时,不会创建EntityKey,并且ObjectContext.Attach失败。在尝试插入我自己创建的EntityKey但失败后,我偶然发现了EntityFramework 4中添加的ObjectSet.Attach。如果缺少EntityKey,它将创建EntityKey,而不是失败。手感不错

代码是(这可能只需很少的步骤,但我知道这是可行的):

var QueryString=“选择值RunTimeUIDesigner.INCIDENT(INCIDENT.INCIDENT\u NBR、INCIDENT.LOCATION等”
ObjectQuery事件=orbcadDB.CreateQuery(QueryString);
events.MergeOption=MergeOption.PreserveChanges;
List retrievedIncidents=incidents.ToList();
orbcadDB.INCIDENTs.Attach(retrievedIncidents[0]);
iNCIDENTsViewSource.Source=检索到的事件;

Gert是正确的,问题是实体没有连接。Dank U wel,Gert!Ik是ervan verbluft! 我只是想添加一点细节来展示完整的解决方案。基本上,ObjectContext有一个Attach方法,因此您可能会认为应该是它。但是,当您的实体SQL select语句命名列,并且您像我一样使用类型创建对象时,不会创建EntityKey,并且ObjectContext.Attach失败。尝试并失败后插入我自己创建的EntityKey,我偶然发现了EntityFramework 4中添加的ObjectSet.Attach。它没有失败,而是在缺少EntityKey的情况下创建了EntityKey。手感不错

代码是(这可能只需很少的步骤,但我知道这是可行的):

var QueryString=“选择值RunTimeUIDesigner.INCIDENT(INCIDENT.INCIDENT\u NBR、INCIDENT.LOCATION等”
ObjectQuery事件=orbcadDB.CreateQuery(QueryString);
events.MergeOption=MergeOption.PreserveChanges;
List retrievedIncidents=incidents.ToList();
orbcadDB.INCIDENTs.Attach(retrievedIncidents[0]);
iNCIDENTsViewSource.Source=检索到的事件;

我认为这与在代码中新建一个
事件
或在上下文中从集合中获取它是一样的。第一个实例没有被跟踪,因为上下文不知道它。不确定它是否相关,但我忘了显示返回值ObjectQuery被传递到CollectionViewSource对象。t这就是数据填充字段的原因,更改被推回实体字段。谢谢。但是如果是这样,我该如何使上下文感知?我认为MergeOption.PreserveChanges可以确保这一点,但它没有效果。你必须
将实体附加到上下文。你是正确的。EntityState已分离。我花了几个小时才完成但是,我想知道如何附加它。经常遇到诸如EntityKey为null、无法附加具有null键的对象等问题,但我已经解决了。将添加详细信息以显示其工作原理。问题:我如何为正确答案提供信用?我想这与在代码中新建事件或从m上下文中的集合。没有跟踪第一个实例,因为上下文不知道它。不确定它是否相关,但我忘记显示返回值ObjectQuery已传递到CollectionViewSource对象。这就是数据填充字段的原因,更改会推回实体字段。谢谢。但是如果是的,我如何使上下文感知?我认为MergeOption.PreserveChanges可以确保这一点,但它没有效果。您必须
将实体附加到上下文。您是正确的。EntityState已分离。但是,我花了数小时才弄清楚如何附加它。一直遇到EntityKey为null之类的问题,无法附加对象ct带有空键,等等,但找到了它。将添加详细信息以显示什么起作用。问题:我如何给你正确答案的分数?