fix(configdb): InstanceLocator single untracked projected join (review 2026-10-21 08/P7)
This commit is contained in:
@@ -22,15 +22,13 @@ public class InstanceLocator : IInstanceLocator
|
|||||||
string instanceUniqueName,
|
string instanceUniqueName,
|
||||||
CancellationToken cancellationToken = default)
|
CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
var instance = await _context.Set<Commons.Entities.Instances.Instance>()
|
// One untracked projected join: this sits on the inbound-API Route.To hot path and
|
||||||
.FirstOrDefaultAsync(i => i.UniqueName == instanceUniqueName, cancellationToken);
|
// only needs a single string, so it must not materialise (and track) two entities.
|
||||||
|
return await (
|
||||||
if (instance == null)
|
from i in _context.Set<Commons.Entities.Instances.Instance>().AsNoTracking()
|
||||||
return null;
|
join s in _context.Set<Commons.Entities.Sites.Site>().AsNoTracking() on i.SiteId equals s.Id
|
||||||
|
where i.UniqueName == instanceUniqueName
|
||||||
var site = await _context.Set<Commons.Entities.Sites.Site>()
|
select s.SiteIdentifier)
|
||||||
.FindAsync(new object[] { instance.SiteId }, cancellationToken);
|
.FirstOrDefaultAsync(cancellationToken);
|
||||||
|
|
||||||
return site?.SiteIdentifier;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1486,6 +1486,24 @@ public class InstanceLocatorTests : IDisposable
|
|||||||
Assert.Equal("SITE-001", result);
|
Assert.Equal("SITE-001", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>The lookup must not track entities (single untracked projection, review 08/P7).</summary>
|
||||||
|
/// <returns>A task that represents the asynchronous operation.</returns>
|
||||||
|
[Fact]
|
||||||
|
public async Task GetSiteIdForInstance_DoesNotTrackEntities()
|
||||||
|
{
|
||||||
|
var site = new Site("Site1", "SITE-001");
|
||||||
|
var template = new Template("T1");
|
||||||
|
_context.Sites.Add(site);
|
||||||
|
_context.Templates.Add(template);
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
_context.Instances.Add(new Instance("Pump1") { SiteId = site.Id, TemplateId = template.Id });
|
||||||
|
await _context.SaveChangesAsync();
|
||||||
|
_context.ChangeTracker.Clear();
|
||||||
|
|
||||||
|
Assert.Equal("SITE-001", await _locator.GetSiteIdForInstanceAsync("Pump1"));
|
||||||
|
Assert.Empty(_context.ChangeTracker.Entries());
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>Verifies that getting the site id for a missing instance returns null.</summary>
|
/// <summary>Verifies that getting the site id for a missing instance returns null.</summary>
|
||||||
/// <returns>A task that represents the asynchronous operation.</returns>
|
/// <returns>A task that represents the asynchronous operation.</returns>
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
Reference in New Issue
Block a user