Skip to content

Commit 946bb26

Browse files
committed
keep registered trigger instances across pooled context leases
1 parent c74c0e6 commit 946bb26

2 files changed

Lines changed: 29 additions & 1 deletion

File tree

‎src/EntityFrameworkCore.Triggered/Internal/TriggerInstanceFactory.cs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ public sealed class TriggerInstanceFactory<TTriggerType> : ITriggerInstanceFacto
2121
{
2222
static ObjectFactory? _internalFactory;
2323

24+
readonly object? _capturedInstance;
2425
object? _instance;
2526

2627
public TriggerInstanceFactory(object? instance)
2728
{
29+
_capturedInstance = instance;
2830
_instance = instance;
2931
}
3032

@@ -46,7 +48,7 @@ public object Create(IServiceProvider serviceProvider)
4648

4749
public void ResetState()
4850
{
49-
_instance = null;
51+
_instance = _capturedInstance;
5052
}
5153

5254
public Task ResetStateAsync(CancellationToken cancellationToken = default)

‎test/EntityFrameworkCore.Triggered.Tests/Infrastructure/ServiceCollectionExtensionsTests.cs‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,32 @@ public void AddTriggeredDbContextPool_ReusesScopedServiceProvider()
122122
Assert.Single(triggerStub.BeforeSaveInvocations);
123123
}
124124

125+
[Fact]
126+
public void AddTriggeredDbContextPool_KeepsRegisteredTriggerInstanceAcrossLeases()
127+
{
128+
var triggerStub = new TriggerStub<TestModel>();
129+
var subject = new ServiceCollection();
130+
subject.AddTriggeredDbContextPool<TestDbContext>(options => {
131+
options.UseInMemoryDatabase(nameof(AddTriggeredDbContextPool_KeepsRegisteredTriggerInstanceAcrossLeases));
132+
options.ConfigureWarnings(warningOptions => {
133+
warningOptions.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning);
134+
});
135+
options.UseTriggers(triggerOptions => triggerOptions.AddTrigger(triggerStub));
136+
}, poolSize: 1);
137+
138+
using var serviceProvider = subject.BuildServiceProvider();
139+
140+
for (var lease = 0; lease < 3; lease++)
141+
{
142+
using var scope = serviceProvider.CreateScope();
143+
var context = scope.ServiceProvider.GetRequiredService<TestDbContext>();
144+
context.TestModels.Add(new TestModel());
145+
context.SaveChanges();
146+
}
147+
148+
Assert.Equal(3, triggerStub.BeforeSaveInvocations.Count);
149+
}
150+
125151
[Fact]
126152
public void AddTriggeredDbContextPool_SupportsAScopedLifetime()
127153
{

0 commit comments

Comments
 (0)