Skip to content

Commit a25dd48

Browse files
committed
Initial efcore 6 support
1 parent c0245b3 commit a25dd48

26 files changed

Lines changed: 127 additions & 60 deletions

src/EntityFrameworkCore.Triggered.AspNetCore/Extensions/ServiceCollectionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace Microsoft.Extensions.DependencyInjection
77
{
88
public static class ServiceCollectionExtensions
99
{
10-
#if EFCORETRIGGERED2
10+
#if EFCORETRIGGERED2 || EFCORETRIGGERED3
1111
[Obsolete("AddAspNetCoreTriggeredDbContext is obsolete and can be replaced by a call to AddTriggeredDbContext instead. EntityFrameworkCore.Triggered.AspNetCore is no longer needed")]
1212
#endif
1313
public static IServiceCollection AddAspNetCoreTriggeredDbContext<TContext>(this IServiceCollection serviceCollection, Action<DbContextOptionsBuilder>? optionsAction = null, ServiceLifetime contextLifetime = ServiceLifetime.Scoped, ServiceLifetime optionsLifetime = ServiceLifetime.Scoped) where TContext : DbContext

src/EntityFrameworkCore.Triggered.Extensions/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ static void RegisterTriggerTypes(Type triggerImplementationType, IServiceCollect
3434

3535
foreach (var customTrigger in customTriggers)
3636
{
37-
services.TryAdd(new ServiceDescriptor(customTrigger, sp => sp.GetService(triggerImplementationType), ServiceLifetime.Transient)); ;
37+
services.TryAdd(new ServiceDescriptor(customTrigger, sp => sp.GetRequiredService(triggerImplementationType), ServiceLifetime.Transient)); ;
3838
}
3939
}
4040
}
@@ -96,7 +96,7 @@ public static IServiceCollection AddAssemblyTriggers(this IServiceCollection ser
9696
registered = true;
9797
}
9898

99-
services.TryAdd(new ServiceDescriptor(triggerType, sp => sp.GetService(assemblyType), ServiceLifetime.Transient));
99+
services.TryAdd(new ServiceDescriptor(triggerType, sp => sp.GetRequiredService(assemblyType), ServiceLifetime.Transient));
100100
}
101101
}
102102

src/EntityFrameworkCore.Triggered.Transactions/Internal/AfterCommitTriggerDescriptor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public AfterCommitTriggerDescriptor(Type entityType)
1515
{
1616
var triggerType = typeof(IAfterCommitTrigger<>).MakeGenericType(entityType);
1717
var triggerMethod = triggerType.GetMethod(nameof(IAfterCommitTrigger<object>.AfterCommit));
18+
Debug.Assert(triggerMethod is not null);
1819

1920
_triggerType = triggerType;
2021
_invocationDelegate = TriggerTypeDescriptorHelpers.GetWeakDelegate(triggerType, entityType, triggerMethod);

src/EntityFrameworkCore.Triggered.Transactions/Internal/AfterRollbackTriggerDescriptor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public AfterRollbackTriggerDescriptor(Type entityType)
1515
{
1616
var triggerType = typeof(IAfterRollbackTrigger<>).MakeGenericType(entityType);
1717
var triggerMethod = triggerType.GetMethod(nameof(IAfterRollbackTrigger<object>.AfterRollback));
18+
Debug.Assert(triggerMethod is not null);
1819

1920
_triggerType = triggerType;
2021
_invocationDelegate = TriggerTypeDescriptorHelpers.GetWeakDelegate(triggerType, entityType, triggerMethod);

src/EntityFrameworkCore.Triggered.Transactions/Internal/BeforeCommitTriggerDescriptor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public BeforeCommitTriggerDescriptor(Type entityType)
1515
{
1616
var triggerType = typeof(IBeforeCommitTrigger<>).MakeGenericType(entityType);
1717
var triggerMethod = triggerType.GetMethod(nameof(IBeforeCommitTrigger<object>.BeforeCommit));
18+
Debug.Assert(triggerMethod is not null);
1819

1920
_triggerType = triggerType;
2021
_invocationDelegate = TriggerTypeDescriptorHelpers.GetWeakDelegate(triggerType, entityType, triggerMethod);

src/EntityFrameworkCore.Triggered.Transactions/Internal/BeforeRollbackTriggerDescriptor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public BeforeRollbackTriggerDescriptor(Type entityType)
1515
{
1616
var triggerType = typeof(IBeforeRollbackTrigger<>).MakeGenericType(entityType);
1717
var triggerMethod = triggerType.GetMethod(nameof(IBeforeRollbackTrigger<object>.BeforeRollback));
18+
Debug.Assert(triggerMethod is not null);
1819

1920
_triggerType = triggerType;
2021
_invocationDelegate = TriggerTypeDescriptorHelpers.GetWeakDelegate(triggerType, entityType, triggerMethod);

src/EntityFrameworkCore.Triggered/Extensions/ServiceCollectionExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public static IServiceCollection AddTriggeredDbContextPool<TContext>(this IServi
5555
return serviceCollection;
5656
}
5757

58-
#if EFCORETRIGGERED2
58+
#if EFCORETRIGGERED2 || EFCORETRIGGERED3
5959
public static IServiceCollection AddTriggeredDbContextFactory<TContext>(this IServiceCollection serviceCollection, Action<DbContextOptionsBuilder>? optionsAction = null, ServiceLifetime lifetime = ServiceLifetime.Singleton)
6060
where TContext : DbContext
6161
{
@@ -78,7 +78,7 @@ public static IServiceCollection AddTriggeredDbContextFactory<TContext>(this ISe
7878

7979
serviceCollection.Replace(ServiceDescriptor.Describe(
8080
serviceType: typeof(IDbContextFactory<TContext>),
81-
implementationFactory: serviceProvider => ActivatorUtilities.CreateInstance(serviceProvider, triggeredFactoryType, serviceProvider.GetService(serviceDescriptor.ImplementationType), serviceProvider),
81+
implementationFactory: serviceProvider => ActivatorUtilities.CreateInstance(serviceProvider, triggeredFactoryType, serviceProvider.GetRequiredService(serviceDescriptor.ImplementationType), serviceProvider),
8282
lifetime: ServiceLifetime.Scoped
8383
));
8484
}
@@ -109,7 +109,7 @@ public static IServiceCollection AddTriggeredDbContextFactory<TContext, TFactory
109109

110110
serviceCollection.Replace(ServiceDescriptor.Describe(
111111
serviceType: typeof(IDbContextFactory<TContext>),
112-
implementationFactory: serviceProvider => ActivatorUtilities.CreateInstance(serviceProvider, triggeredFactoryType, serviceProvider.GetService(serviceDescriptor.ImplementationType), serviceProvider),
112+
implementationFactory: serviceProvider => ActivatorUtilities.CreateInstance(serviceProvider, triggeredFactoryType, serviceProvider.GetRequiredService(serviceDescriptor.ImplementationType), serviceProvider),
113113
lifetime: ServiceLifetime.Scoped
114114
));
115115
}
@@ -139,7 +139,7 @@ public static IServiceCollection AddTriggeredPooledDbContextFactory<TContext>(th
139139

140140
serviceCollection.Replace(ServiceDescriptor.Describe(
141141
serviceType: typeof(IDbContextFactory<TContext>),
142-
implementationFactory: serviceProvider => ActivatorUtilities.CreateInstance(serviceProvider, triggeredFactoryType, serviceProvider.GetService(serviceDescriptor.ImplementationType), serviceProvider),
142+
implementationFactory: serviceProvider => ActivatorUtilities.CreateInstance(serviceProvider, triggeredFactoryType, serviceProvider.GetRequiredService(serviceDescriptor.ImplementationType), serviceProvider),
143143
lifetime: ServiceLifetime.Scoped
144144
));
145145
}

src/EntityFrameworkCore.Triggered/Infrastructure/Internal/TriggersOptionExtension.cs

Lines changed: 69 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ public class TriggersOptionExtension : IDbContextOptionsExtension
1616
{
1717
sealed class ExtensionInfo : DbContextOptionsExtensionInfo
1818
{
19-
private int? _serviceProviderHash;
2019
private string? _logFragment;
2120
public ExtensionInfo(IDbContextOptionsExtension extension) : base(extension)
2221
{
@@ -36,56 +35,94 @@ public override string LogFragment
3635
}
3736
}
3837

39-
public override long GetServiceProviderHashCode()
38+
public new TriggersOptionExtension Extension => (TriggersOptionExtension)base.Extension;
39+
40+
public override void PopulateDebugInfo(IDictionary<string, string> debugInfo)
4041
{
41-
if (_serviceProviderHash == null)
42+
if (debugInfo == null)
4243
{
43-
var hashCode = nameof(TriggersOptionExtension).GetHashCode();
44+
throw new ArgumentNullException(nameof(debugInfo));
45+
}
4446

45-
var extension = (TriggersOptionExtension)Extension;
47+
debugInfo["Triggers:TriggersCount"] = (Extension._triggers?.Count() ?? 0).ToString();
48+
debugInfo["Triggers:TriggerTypesCount"] = (Extension._triggerTypes?.Count() ?? 0).ToString();
49+
debugInfo["Triggers:MaxCascadeCycles"] = Extension._maxCascadeCycles.ToString();
50+
debugInfo["Triggers:CascadeBehavior"] = Extension._cascadeBehavior.ToString();
51+
}
4652

47-
if (extension._triggers != null)
53+
#if EFCORETRIGGERED3
54+
public override int GetServiceProviderHashCode()
55+
{
56+
var hashCode = new HashCode();
57+
58+
if (Extension._triggers != null)
59+
{
60+
foreach (var trigger in Extension._triggers)
4861
{
49-
foreach (var trigger in extension._triggers)
50-
{
51-
hashCode ^= trigger.GetHashCode();
52-
}
62+
hashCode.Add(trigger);
5363
}
64+
}
5465

55-
if (extension._triggerTypes != null)
66+
if (Extension._triggerTypes != null)
67+
{
68+
foreach (var triggerType in Extension._triggerTypes)
5669
{
57-
foreach (var triggerType in extension._triggerTypes)
58-
{
59-
hashCode ^= triggerType.GetHashCode();
60-
}
70+
hashCode.Add(triggerType);
6171
}
72+
}
6273

63-
hashCode ^= extension._maxCascadeCycles.GetHashCode();
64-
hashCode ^= extension._cascadeBehavior.GetHashCode();
74+
hashCode.Add(Extension._maxCascadeCycles);
75+
hashCode.Add(Extension._cascadeBehavior);
6576

66-
if (extension._serviceProviderTransform != null)
77+
if (Extension._serviceProviderTransform != null)
78+
{
79+
hashCode.Add(Extension._serviceProviderTransform);
80+
}
81+
82+
return hashCode.ToHashCode();
83+
}
84+
85+
public override bool ShouldUseSameServiceProvider(DbContextOptionsExtensionInfo other)
86+
=> other is ExtensionInfo otherInfo
87+
&& Extension._triggers == otherInfo.Extension._triggers
88+
&& Extension._triggers == otherInfo.Extension._triggerTypes
89+
&& Extension._maxCascadeCycles == otherInfo.Extension._maxCascadeCycles
90+
&& Extension._cascadeBehavior == otherInfo.Extension._cascadeBehavior
91+
&& Extension._serviceProviderTransform == otherInfo.Extension._serviceProviderTransform;
92+
#else
93+
public override long GetServiceProviderHashCode()
94+
{
95+
var hashCode = nameof(TriggersOptionExtension).GetHashCode();
96+
97+
var extension = (TriggersOptionExtension)Extension;
98+
99+
if (extension._triggers != null)
100+
{
101+
foreach (var trigger in extension._triggers)
67102
{
68-
hashCode ^= extension._serviceProviderTransform.GetHashCode();
103+
hashCode ^= trigger.GetHashCode();
69104
}
105+
}
70106

71-
_serviceProviderHash = hashCode;
107+
if (extension._triggerTypes != null)
108+
{
109+
foreach (var triggerType in extension._triggerTypes)
110+
{
111+
hashCode ^= triggerType.GetHashCode();
112+
}
72113
}
73114

74-
return _serviceProviderHash.Value;
75-
}
115+
hashCode ^= extension._maxCascadeCycles.GetHashCode();
116+
hashCode ^= extension._cascadeBehavior.GetHashCode();
76117

77-
public override void PopulateDebugInfo(IDictionary<string, string> debugInfo)
78-
{
79-
if (debugInfo == null)
118+
if (extension._serviceProviderTransform != null)
80119
{
81-
throw new ArgumentNullException(nameof(debugInfo));
120+
hashCode ^= extension._serviceProviderTransform.GetHashCode();
82121
}
83122

84-
debugInfo["Triggers:TriggersCount"] = (((TriggersOptionExtension)Extension)._triggers?.Count() ?? 0).ToString();
85-
debugInfo["Triggers:TriggerTypesCount"] = (((TriggersOptionExtension)Extension)._triggerTypes?.Count() ?? 0).ToString();
86-
debugInfo["Triggers:MaxCascadeCycles"] = ((TriggersOptionExtension)Extension)._maxCascadeCycles.ToString();
87-
debugInfo["Triggers:CascadeBehavior"] = ((TriggersOptionExtension)Extension)._cascadeBehavior.ToString();
123+
return hashCode;
88124
}
125+
#endif
89126
}
90127

91128
private ExtensionInfo? _info;
@@ -148,7 +185,7 @@ public void ApplyServices(IServiceCollection services)
148185

149186
services.AddScoped<TriggerFactory>();
150187

151-
#if EFCORETRIGGERED2
188+
#if EFCORETRIGGERED2 || EFCORETRIGGERED3
152189
services.TryAddScoped<IInterceptor, TriggerSessionSaveChangesInterceptor>();
153190
#endif
154191

@@ -192,7 +229,7 @@ public void ApplyServices(IServiceCollection services)
192229
triggerInstanceFactoryBuilder =
193230
Expression.Lambda<Func<object?, object>>(
194231
Expression.New(
195-
typeof(TriggerInstanceFactory<>).MakeGenericType(triggerServiceType).GetConstructor(new[] { typeof(object) }),
232+
typeof(TriggerInstanceFactory<>).MakeGenericType(triggerServiceType).GetConstructor(new[] { typeof(object) })!,
196233
instanceParamExpression
197234
),
198235
instanceParamExpression
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Linq;
45

56
namespace EntityFrameworkCore.Triggered.Infrastructure.Internal
@@ -11,11 +12,13 @@ public static IEnumerable<Type> FindGenericInterfaces(Type type, Type interfaceT
1112

1213
public static IEnumerable<Type> EnumerateTypeHierarchy(Type type)
1314
{
14-
do
15+
Type? nextType = type;
16+
17+
while(nextType is not null)
1518
{
16-
yield return type;
17-
type = type.BaseType;
18-
} while (type != null);
19+
yield return nextType;
20+
nextType = nextType.BaseType;
21+
} while (nextType != null);
1922
}
2023
}
2124
}

src/EntityFrameworkCore.Triggered/Internal/AfterSaveFailedTriggerDescriptor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics;
23
using System.Threading;
34
using System.Threading.Tasks;
45

@@ -13,6 +14,7 @@ public AfterSaveFailedTriggerDescriptor(Type entityType, Exception exception)
1314
{
1415
var triggerType = typeof(IAfterSaveFailedTrigger<>).MakeGenericType(entityType);
1516
var triggerMethod = triggerType.GetMethod(nameof(IAfterSaveFailedTrigger<object>.AfterSaveFailed));
17+
Debug.Assert(triggerMethod is not null);
1618

1719
_triggerType = triggerType;
1820
_invocationDelegate = TriggerTypeDescriptorHelpers.GetWeakDelegateWithException(triggerType, entityType, triggerMethod);

0 commit comments

Comments
 (0)