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