Skip to content

Commit 26c8d88

Browse files
committed
Fixed breaking change in EFCore6
1 parent 841b633 commit 26c8d88

File tree

3 files changed

+109
-1
lines changed

3 files changed

+109
-1
lines changed

src/EntityFrameworkCore.Triggered/Internal/HybridServiceProvider.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,27 @@ public HybridServiceProvider(IServiceProvider serviceProvider, DbContext dbConte
1616

1717
public object? GetService(Type serviceType)
1818
{
19+
#if EFCORETRIGGERED3
20+
// Starting from EF Core Triggered v3 we prefer the captured DbContext over our registry
21+
if (serviceType.IsAssignableFrom(_dbContext.GetType()))
22+
{
23+
return _dbContext;
24+
}
25+
#endif
26+
1927
var result = _serviceProvider.GetService(serviceType);
2028
if (result is not null)
2129
{
2230
return result;
2331
}
2432

33+
#if EFCORETRIGGERED3
34+
#else
2535
if (typeof(DbContext).IsAssignableFrom(serviceType))
2636
{
2737
return _dbContext;
2838
}
39+
#endif
2940

3041
return default;
3142
}

test/EntityFrameworkCore.Triggered.Tests/Internal/HybridServiceProviderTests.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,25 @@ public void ScenarioTests(ScenarioContext scenario)
4949
});
5050
}
5151

52+
53+
#if EFCORETRIGGERED3
54+
[Fact]
55+
public void CantOverrideDbContext()
56+
{
57+
var dbContext1 = new ConcreteCustomDbContext();
58+
var dbContext2 = new ConcreteCustomDbContext();
59+
60+
var serviceProvider = new ServiceCollection()
61+
.AddSingleton(dbContext2)
62+
.BuildServiceProvider();
63+
64+
var subject = new HybridServiceProvider(serviceProvider, dbContext1);
65+
66+
var result = subject.GetRequiredService<ConcreteCustomDbContext>();
67+
68+
Assert.Equal(dbContext1, result);
69+
}
70+
#else
5271
[Fact]
5372
public void CanOverrideDbContext()
5473
{
@@ -65,6 +84,6 @@ public void CanOverrideDbContext()
6584

6685
Assert.Equal(dbContext2, result);
6786
}
68-
87+
#endif
6988
}
7089
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Microsoft.EntityFrameworkCore;
8+
using Microsoft.EntityFrameworkCore.Diagnostics;
9+
using Microsoft.Extensions.DependencyInjection;
10+
using Xunit;
11+
12+
namespace EntityFrameworkCore.Triggered.Tests
13+
{
14+
public class TriggeredDbContextFactoryTests
15+
{
16+
public class TestModel
17+
{
18+
public Guid Id { get; set; }
19+
public string Name { get; set; }
20+
}
21+
22+
class TestTrigger : IBeforeSaveTrigger<TestModel>
23+
{
24+
readonly TestDbContext _testDbContext;
25+
26+
public TestTrigger(TestDbContext testDbContext)
27+
{
28+
_testDbContext = testDbContext;
29+
}
30+
31+
public Task BeforeSave(ITriggerContext<TestModel> context, CancellationToken cancellationToken)
32+
{
33+
_testDbContext.TriggerRaised = true;
34+
return Task.CompletedTask;
35+
}
36+
}
37+
38+
#pragma warning disable CS0618 // Type or member is obsolete
39+
class TestDbContext : TriggeredDbContext
40+
#pragma warning restore CS0618 // Type or member is obsolete
41+
{
42+
public TestDbContext(DbContextOptions options)
43+
: base(options)
44+
{
45+
46+
}
47+
48+
public DbSet<TestModel> TestModels { get; set; }
49+
50+
public bool TriggerRaised { get; set; } = false;
51+
}
52+
53+
[Fact]
54+
public void DbContextFactory_RaisesTrigger_SharesDbContext()
55+
{
56+
using var serviceProvider = new ServiceCollection()
57+
.AddTriggeredDbContextFactory<TestDbContext>(options => {
58+
options.UseInMemoryDatabase(nameof(DbContextFactory_RaisesTrigger_SharesDbContext));
59+
options.UseTriggers(triggerOptions => {
60+
triggerOptions.AddTrigger<TestTrigger>();
61+
});
62+
options.ConfigureWarnings(warningOptions => {
63+
warningOptions.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning);
64+
});
65+
})
66+
.BuildServiceProvider();
67+
68+
using var serviceScope = serviceProvider.CreateScope();
69+
var dbContextFactory = serviceScope.ServiceProvider.GetService<IDbContextFactory<TestDbContext>>();
70+
using var dbContext = dbContextFactory.CreateDbContext();
71+
72+
dbContext.TestModels.Add(new TestModel { });
73+
dbContext.SaveChanges();
74+
75+
Assert.True(dbContext.TriggerRaised);
76+
}
77+
}
78+
}

0 commit comments

Comments
 (0)