Skip to content

Commit 57b79d0

Browse files
committed
Edding EF
1 parent d8288e3 commit 57b79d0

File tree

55 files changed

+1650
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1650
-0
lines changed

src/Directory.Packages.props

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
<PackageVersion Include="HdrHistogram" Version="2.5.0" />
2020
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.21" />
2121
<PackageVersion Include="Microsoft.AspNetCore.SignalR.Client" Version="8.0.21" />
22+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.11" />
23+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.11" />
24+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.11" />
25+
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.11" />
2226
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
2327
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="8.0.2" />
2428
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
@@ -50,6 +54,7 @@
5054
<PackageVersion Include="NServiceBus.Transport.Msmq.Sources" Version="3.0.2" />
5155
<PackageVersion Include="NServiceBus.Transport.SqlServer" Version="8.1.9" />
5256
<PackageVersion Include="NServiceBus.Transport.PostgreSql" Version="8.1.9" />
57+
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
5358
<PackageVersion Include="NuGet.Versioning" Version="6.14.0" />
5459
<PackageVersion Include="NUnit" Version="4.4.0" />
5560
<PackageVersion Include="NUnit.Analyzers" Version="4.11.2" />
@@ -62,6 +67,7 @@
6267
<PackageVersion Include="Particular.LicensingComponent.Report" Version="1.0.0" />
6368
<PackageVersion Include="Particular.Obsoletes" Version="1.0.0" />
6469
<PackageVersion Include="Polly.Core" Version="8.5.2" />
70+
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.2" />
6571
<PackageVersion Include="PropertyChanged.Fody" Version="4.1.0" />
6672
<PackageVersion Include="PropertyChanging.Fody" Version="1.30.3" />
6773
<PackageVersion Include="PublicApiGenerator" Version="11.5.4" />
@@ -78,6 +84,9 @@
7884
<PackageVersion Include="System.Reactive.Linq" Version="6.0.1" />
7985
<PackageVersion Include="System.Reflection.MetadataLoadContext" Version="8.0.1" />
8086
<PackageVersion Include="System.ServiceProcess.ServiceController" Version="8.0.1" />
87+
<PackageVersion Include="Testcontainers.MsSql" Version="4.2.0" />
88+
<PackageVersion Include="Testcontainers.MySql" Version="4.2.0" />
89+
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.2.0" />
8190
<PackageVersion Include="Validar.Fody" Version="1.9.0" />
8291
<PackageVersion Include="Yarp.ReverseProxy" Version="2.3.0" />
8392
</ItemGroup>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[*.cs]
2+
3+
# Justification: ServiceControl app has no synchronization context
4+
dotnet_diagnostic.CA2007.severity = none
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Abstractions;
2+
3+
public interface IDatabaseMigrator
4+
{
5+
Task ApplyMigrations(CancellationToken cancellationToken = default);
6+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Abstractions;
2+
3+
using ServiceControl.Persistence;
4+
5+
public abstract class SqlPersisterSettings : PersistenceSettings
6+
{
7+
public required string ConnectionString { get; set; }
8+
public int CommandTimeout { get; set; } = 30;
9+
public bool EnableSensitiveDataLogging { get; set; } = false;
10+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace ServiceControl.Persistence.Sql.Core.DbContexts;
2+
3+
using Entities;
4+
using EntityConfigurations;
5+
using Microsoft.EntityFrameworkCore;
6+
7+
public abstract class ServiceControlDbContextBase : DbContext
8+
{
9+
protected ServiceControlDbContextBase(DbContextOptions options) : base(options)
10+
{
11+
}
12+
13+
public DbSet<TrialLicenseEntity> TrialLicenses { get; set; }
14+
15+
protected override void OnModelCreating(ModelBuilder modelBuilder)
16+
{
17+
base.OnModelCreating(modelBuilder);
18+
19+
modelBuilder.ApplyConfiguration(new TrialLicenseConfiguration());
20+
21+
OnModelCreatingProvider(modelBuilder);
22+
}
23+
24+
protected virtual void OnModelCreatingProvider(ModelBuilder modelBuilder)
25+
{
26+
}
27+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Entities;
2+
3+
public class TrialLicenseEntity
4+
{
5+
public int Id { get; set; }
6+
public DateOnly TrialEndDate { get; set; }
7+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
namespace ServiceControl.Persistence.Sql.Core.EntityConfigurations;
2+
3+
using Entities;
4+
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
6+
7+
class TrialLicenseConfiguration : IEntityTypeConfiguration<TrialLicenseEntity>
8+
{
9+
public void Configure(EntityTypeBuilder<TrialLicenseEntity> builder)
10+
{
11+
builder.ToTable("TrialLicense");
12+
13+
builder.HasKey(e => e.Id);
14+
15+
// Ensure only one row exists by using a fixed primary key
16+
builder.Property(e => e.Id)
17+
.HasDefaultValue(1)
18+
.ValueGeneratedNever();
19+
20+
builder.Property(e => e.TrialEndDate)
21+
.IsRequired();
22+
}
23+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
namespace ServiceControl.Persistence.Sql.Core.Implementation;
2+
3+
using DbContexts;
4+
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using ServiceControl.Persistence;
7+
8+
public class TrialLicenseDataProvider : ITrialLicenseDataProvider
9+
{
10+
readonly IServiceProvider serviceProvider;
11+
const int SingletonId = 1;
12+
13+
public TrialLicenseDataProvider(IServiceProvider serviceProvider)
14+
{
15+
this.serviceProvider = serviceProvider;
16+
}
17+
18+
public async Task<DateOnly?> GetTrialEndDate(CancellationToken cancellationToken)
19+
{
20+
using var scope = serviceProvider.CreateScope();
21+
var dbContext = scope.ServiceProvider.GetRequiredService<ServiceControlDbContextBase>();
22+
23+
var entity = await dbContext.TrialLicenses
24+
.AsNoTracking()
25+
.FirstOrDefaultAsync(t => t.Id == SingletonId, cancellationToken);
26+
27+
return entity?.TrialEndDate;
28+
}
29+
30+
public async Task StoreTrialEndDate(DateOnly trialEndDate, CancellationToken cancellationToken)
31+
{
32+
using var scope = serviceProvider.CreateScope();
33+
var dbContext = scope.ServiceProvider.GetRequiredService<ServiceControlDbContextBase>();
34+
35+
var existingEntity = await dbContext.TrialLicenses
36+
.FirstOrDefaultAsync(t => t.Id == SingletonId, cancellationToken);
37+
38+
if (existingEntity != null)
39+
{
40+
// Update existing
41+
existingEntity.TrialEndDate = trialEndDate;
42+
}
43+
else
44+
{
45+
// Insert new
46+
var newEntity = new Entities.TrialLicenseEntity
47+
{
48+
Id = SingletonId,
49+
TrialEndDate = trialEndDate
50+
};
51+
await dbContext.TrialLicenses.AddAsync(newEntity, cancellationToken);
52+
}
53+
54+
await dbContext.SaveChangesAsync(cancellationToken);
55+
}
56+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="Microsoft.EntityFrameworkCore" />
11+
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" />
12+
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" />
13+
</ItemGroup>
14+
15+
<ItemGroup>
16+
<ProjectReference Include="..\ServiceControl.Persistence\ServiceControl.Persistence.csproj" />
17+
</ItemGroup>
18+
19+
</Project>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[*.cs]
2+
3+
# Justification: ServiceControl app has no synchronization context
4+
dotnet_diagnostic.CA2007.severity = none

0 commit comments

Comments
 (0)