Skip to content

Commit 807e4b3

Browse files
committed
Fix EntitySet enumerator behavior change caused by the Dictionary enumerator behavior change (See dotnet/runtime#26314)
1 parent 355684a commit 807e4b3

2 files changed

Lines changed: 30 additions & 14 deletions

File tree

Orm/Xtensive.Orm.Tests/Issues/IssueJira0718_EntitySetEnumerationBug.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,7 @@ public void ClientProfileTest19()
10241024
Assert.Throws<InvalidOperationException>(
10251025
() => {
10261026
foreach (var orderItem in customerOrder.Items)
1027-
customerOrder.Remove();
1027+
customerOrderItem.Remove();
10281028
});
10291029
transaction.Complete();
10301030
}

Orm/Xtensive.Orm/Orm/Internals/EntitySetState.cs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -298,21 +298,37 @@ protected override void Refresh()
298298
public IEnumerator<Key> GetEnumerator()
299299
{
300300
var versionSnapshot = version;
301-
var fetchedKeysBeforePersist = FetchedKeys;
302-
var addedKeysBeforePersist = addedKeys;
303-
var removedKeysBeforePersist = removedKeys;
304-
foreach (var fetchedKey in fetchedKeysBeforePersist) {
305-
if (versionSnapshot!=version)
306-
throw new InvalidOperationException(Strings.ExCollectionHasBeenChanged);
307-
if (!removedKeysBeforePersist.ContainsKey(fetchedKey))
308-
yield return fetchedKey;
309-
}
310-
foreach (var addedKey in addedKeysBeforePersist) {
311-
if (versionSnapshot!=version)
312-
throw new InvalidOperationException(Strings.ExCollectionHasBeenChanged);
313-
yield return addedKey.Value;
301+
using (var fetchedKeysEnumerator = FetchedKeys.GetEnumerator()) {
302+
while (true) {
303+
if (versionSnapshot != version) {
304+
throw new InvalidOperationException(Strings.ExCollectionHasBeenChanged);
305+
}
306+
307+
if (!fetchedKeysEnumerator.MoveNext()) {
308+
break;
309+
}
310+
311+
var fetchedKey = fetchedKeysEnumerator.Current;
312+
if (!removedKeys.ContainsKey(fetchedKey)) {
313+
yield return fetchedKey;
314+
}
315+
}
314316
}
315317

318+
using (var addedKeysEnumerator = addedKeys.GetEnumerator()) {
319+
while (true) {
320+
if (versionSnapshot != version) {
321+
throw new InvalidOperationException(Strings.ExCollectionHasBeenChanged);
322+
}
323+
324+
if (!addedKeysEnumerator.MoveNext()) {
325+
break;
326+
}
327+
328+
var addedKey = addedKeysEnumerator.Current;
329+
yield return addedKey.Value;
330+
}
331+
}
316332
}
317333

318334
/// <inheritdoc/>

0 commit comments

Comments
 (0)