* ObjectTest.cs: fix: 修复引用已存在对象保存多次的 bug

* AVObject.cs:
oneRain 2019-12-06 17:02:10 +08:00
parent 48bcd68eec
commit 283bb2e58b
2 changed files with 19 additions and 9 deletions

View File

@ -293,5 +293,15 @@ namespace LeanCloud.Test {
};
await p.Save();
}
[Test]
public async Task SaveWithQuery() {
AVObject p = new AVObject("P");
AVObject c1 = AVObject.CreateWithoutData("C1", "5dea05578a84ab00680b7ae5");
AVObject c2 = new AVObject("C2");
p["c"] = c1;
c1["c"] = c2;
await p.Save();
}
}
}

View File

@ -1567,15 +1567,10 @@ string propertyName
static Stack<Batch> BatchObjects(IEnumerable<AVObject> avObjects) {
Stack<Batch> batches = new Stack<Batch>();
batches.Push(new Batch(avObjects));
IEnumerable<object> deps = avObjects;
IEnumerable<object> deps = from avObj in avObjects select avObj.estimatedData.Values;
do {
// 只添加本层依赖的 LCObject
IEnumerable<AVObject> depAVObjs = deps.OfType<AVObject>();
if (depAVObjs.Any()) {
batches.Push(new Batch(depAVObjs));
}
HashSet<object> childSets = new HashSet<object>();
foreach (object dep in deps) {
IEnumerable children = null;
@ -1585,6 +1580,7 @@ string propertyName
children = (dep as IDictionary).Values;
} else if (dep is AVObject && (dep as AVObject).ObjectId == null) {
// 如果依赖是 AVObject 类型并且还没有保存过,则应该遍历其依赖
// TODO 这里应该是从 Operation 中查找新增的对象
children = (dep as AVObject).estimatedData.Values;
}
if (children != null) {
@ -1593,6 +1589,10 @@ string propertyName
}
}
}
IEnumerable<AVObject> depAVObjs = deps.OfType<AVObject>().Where(o => o.ObjectId == null);
if (depAVObjs.Any()) {
batches.Push(new Batch(depAVObjs));
}
deps = childSets;
} while (deps != null && deps.Any());