mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-06-28 15:34:39 +08:00
TermsPart.Record usage made before the delegate to avoid accessing a scope which is already disposed. (#8766)
This commit is contained in:
parent
50d416c9f2
commit
2d7ce45d1e
@ -60,13 +60,22 @@ namespace Orchard.Taxonomies.Handlers {
|
|||||||
var queryHint = new QueryHints()
|
var queryHint = new QueryHints()
|
||||||
.ExpandRecords("ContentTypeRecord", "CommonPartRecord", "TermsPartRecord");
|
.ExpandRecords("ContentTypeRecord", "CommonPartRecord", "TermsPartRecord");
|
||||||
|
|
||||||
|
// Get TermRecordIds for each field before the delegate inside the for iterator.
|
||||||
|
// This avoids the TermsPart.Record lifetime scope to be disposed when executed, since ContentPart.Record is a LazyField.
|
||||||
|
var groupedRecordIds = part.Record.Terms
|
||||||
|
.GroupBy(tci => tci.Field)
|
||||||
|
.ToDictionary(g => g.Key,
|
||||||
|
g => g.Select(tci => tci.TermRecord.Id).ToArray());
|
||||||
|
|
||||||
foreach (var field in part.ContentItem.Parts.SelectMany(p => p.Fields).OfType<TaxonomyField>()) {
|
foreach (var field in part.ContentItem.Parts.SelectMany(p => p.Fields).OfType<TaxonomyField>()) {
|
||||||
var tempField = field.Name;
|
var tempField = field.Name;
|
||||||
field.TermsField.Loader(() => {
|
field.TermsField.Loader(() => {
|
||||||
var fieldTermRecordIds = part.Record.Terms.Where(t => t.Field == tempField).Select(tci => tci.TermRecord.Id);
|
var terms = Enumerable.Empty<TermPart>();
|
||||||
|
if (groupedRecordIds.TryGetValue(tempField, out var fieldTermRecordIds)) {
|
||||||
// Using context content item's ContentManager instead of injected one to avoid lifetime scope exceptions in case of LazyFields.
|
// Using context content item's ContentManager instead of injected one to avoid lifetime scope exceptions in case of LazyFields.
|
||||||
var terms = part.ContentItem.ContentManager.GetMany<TermPart>(fieldTermRecordIds, VersionOptions.Published, queryHint);
|
terms = part.ContentItem.ContentManager.GetMany<TermPart>(fieldTermRecordIds, VersionOptions.Published, queryHint);
|
||||||
|
}
|
||||||
|
|
||||||
return terms.ToList();
|
return terms.ToList();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user