Breeze hasChanges()==应用程序启动时为true

Breeze hasChanges()==应用程序启动时为true,breeze,Breeze,编辑:JSON不完整,必须剪切一些 当第一次从服务器查询时,一个实体的EntityState被“添加”。 我在DBContextInitializer中创建了3个用户。每次我启动应用程序时都会发生这种情况。如果我调用Manager.rejectChanges(),它将处于“未更改”状态,但我必须手动执行此操作 如果我不这样做,并保存另一个实体(可能是Team/Order/OrderDetail),则特定用户将被保存为其原始实体的副本,该副本具有唯一的键,但具有相同的值,如name等。如果我可能忘

编辑:JSON不完整,必须剪切一些

当第一次从服务器查询时,一个实体的EntityState被“添加”。 我在DBContextInitializer中创建了3个用户。每次我启动应用程序时都会发生这种情况。如果我调用
Manager.rejectChanges()
,它将处于“未更改”状态,但我必须手动执行此操作

如果我不这样做,并保存另一个实体(可能是Team/Order/OrderDetail),则特定用户将被保存为其原始实体的副本,该副本具有唯一的键,但具有相同的值,如name等。如果我可能忘记了什么,我会检查我的代码十几次,但我不会在任何地方调用此用户实体的任何状态更改

这是
Manager.getChanges
(EntityType的“用户”)的打印:

我无法从中提取太多信息,但我认为这一特殊部分很奇怪。为什么此数组中的第三个对象
null
,但在该数组之后不久显示为状态“Added”:


如果有帮助的话,我可以提供更多信息。

愿意提供帮助,我很感激你被困住了。不幸的是,你提供的东西我没有多大进展。让我们用一个更简单的问题陈述和示例再试一次

一个好的开始是查看来自对服务的简单HTTP调用的数据。尝试在浏览器地址栏中输入以下内容:
http://localhost:12345/api/your-服务/用户


您应该看到您创建的三个用户的JSON数据

现在尝试在客户端获取它们:

var em = new breeze.EntityManager('api/your-service'); var q = breeze.EntityQuery.from('Users') .using(em).execute() .then(querySucceeded) .fail(queryFailed); function querySucceeded(data) { var users = data.results; var changes = em.getChanges(); var msg = "User count = " + users.length + "; pending changes = " + changes.length; alert(msg); function queryFailed(error) { alert('Query failed: '+error.message); } var em=new breeze.EntityManager(“api/您的服务”); var q=breeze.EntityQuery.from('用户') .using(em.execute()) .然后(查询成功) 。失败(查询失败); 函数查询成功(数据){ var用户=数据。结果; var changes=em.getChanges(); var msg=“User count=“+users.length+ “待定更改=“+changes.length; 警报(msg); 函数查询失败(错误){ 警报(“查询失败:”+错误消息); }
如果警报框确认您有3个用户和非零的挂起更改…您有一些我们可以认真研究的问题。

我也有同样的问题。我发现导致这种情况的原因是结果中包含的导航属性(许多)。我仍在调查此问题,但它看起来像UpdateRetentityInCollection()在Breeze中,当连接与“主”对象一起接收的关联对象时,设置“已添加”

函数updateRelatedEntityInCollection(relatedEntity,relatedEntity,targetEntity,inverseProperty){
如果(!relatedEntity)返回;
//检查相关实体是否已连接
var thisEntity=relatedEntity.getProperty(inverseProperty.name);
if(thisEntity!==targetEntity){
//如果没有-把它挂起来。

relatedEntities.push(relatedEntity);//我已经在V0.73.6上对此进行了测试,并确保在内部调用了“updateRelatedEntityInCollection”方法

到目前为止,我还无法重现entityManager.hasChanges()返回true或entityManager.getChanges()返回任何查询结果的任何实体的问题


我尝试过使用查询“扩展”、“loadNavigationProperty”,并更改QueryOptions.MergeStrategy。所有这些都不需要重新编译;因此任何其他提示都会非常有用。

好的,服务器上的某些实体图存在一个错误,在序列化到客户端时会导致虚假的实体状态更改。这应该在v0.74.2中修复,可从breeze网站或通过nuget获得。请让我们知道这是否纠正了您的问题。

感谢您的快速回复:)。感谢您的快速回复:)。首先:该服务有效,我获得了用户。它适用于我拥有的所有实体,但返回“用户计数=3;待定更改=1”…我的SPA中有一个小测试页。一个带有codemirror的文本区域,我可以在其中输入EntityQueries并获取每个求值(字符串)的数据。我发送的每个(!)查询,无论是哪个实体,始终有1个挂起的更改。在执行查询之前的查询方法中,我调用“manager.rejectChanges()”。没有更改,每次仍有1个挂起。(按钮触发查询,敲除打印结果)。如果我将查询从“Users”更改为“Teams”…第二次查询的结果将更改为“pending=0”,反之亦然。无论我使用什么实体,都是相同的。更好的示例:应用程序在起始页加载所有用户,如列表所示。导航到JSON测试页并查询“Teams”(
manager.rejectChanges()
before each query)pending=1始终。切换一次到起始页(从服务器重新查询用户)并返回到JSON测试页。“Teams”的第一个查询已挂起0。之后,一切正常。(仍然没有做太多)我想你必须给我们发送一个例子。我从来没有见过这样的例子。请你把它归结为一个绝对重要的失败例子(删除所有不必要的服务器和客户端代码以及html也是非常重要的)。删除bin和obj文件夹。删除packages文件夹。压缩它…然后用电子邮件发送Zip(这样我可以回复)并将这篇SO帖子链接到IdeaBrade.com上的askWard。我会看看我能做些什么。为你的痛苦感到抱歉。很好的线索!我希望从你和/或@Sascha那里收到一个失败的例子。我刚刚将mvcapapplication2.zip发送到askWard。它基于ToDo示例nuget。收到了。我知道你在做什么…以及为什么这会触发未成功的事件反恐执行局的行为。我会私下给你回信。当我们都清楚发生了什么事情以及你的意图时,我会在这里总结。我没有收到你的邮件,但v0.74.2修复了问题。如果我使用breeze的方式有问题,请让我们知道。感谢你的快速回复。你做得很好。对不起,我没有返回你个人。我知道74.2处理过,我们认为你会
"_entities": [
                {
                    "entityAspect": {
                        "entityState": {
                            "_$typeName": "EntityState",
                            "name": "Unchanged"
                        },
                        "isBeingSaved": false,
                        "originalValues": {},
                        "_validationErrors": {},
                        "validationErrorsChanged": {
                            "name": "validationErrorsChanged_entityAspect",
                            "_nextUnsubKey": 1
                        },
                        "propertyChanged": {
                            "name": "propertyChanged_entityAspect",
                            "_nextUnsubKey": 1
                        },
                        "_entityKey": {
                            "entityType": "User:#MAHN.Model",
                            "values": [
                                2
                            ]
                        },
                        "wasLoaded": true
                    }
                },
                {
                    "entityAspect": {
                        "entityState": {
                            "_$typeName": "EntityState",
                            "name": "Unchanged"
                        },
                        "isBeingSaved": false,
                        "originalValues": {},
                        "_validationErrors": {},
                        "validationErrorsChanged": {
                            "name": "validationErrorsChanged_entityAspect",
                            "_nextUnsubKey": 1
                        },
                        "propertyChanged": {
                            "name": "propertyChanged_entityAspect",
                            "_nextUnsubKey": 1
                        },
                        "_entityKey": {
                            "entityType": "User:#MAHN.Model",
                            "values": [
                                3
                            ]
                        },
                        "wasLoaded": true
                    }
                },
                null
            ],
var em = new breeze.EntityManager('api/your-service'); var q = breeze.EntityQuery.from('Users') .using(em).execute() .then(querySucceeded) .fail(queryFailed); function querySucceeded(data) { var users = data.results; var changes = em.getChanges(); var msg = "User count = " + users.length + "; pending changes = " + changes.length; alert(msg); function queryFailed(error) { alert('Query failed: '+error.message); }
function updateRelatedEntityInCollection(relatedEntity, relatedEntities, targetEntity, inverseProperty) {
        if (!relatedEntity) return;
        // check if the related entity is already hooked up
        var thisEntity = relatedEntity.getProperty(inverseProperty.name);
        if (thisEntity !== targetEntity) {
            // if not - hook it up.
            relatedEntities.push(relatedEntity); // <-- THIS WILL SET "ADDED" ON targetEntity
            relatedEntity.setProperty(inverseProperty.name, targetEntity);
        }
    }