Skip to content

Commit eb3c0b5

Browse files
committed
Make it work on MySQL Again
1 parent e6c9700 commit eb3c0b5

File tree

4 files changed

+55
-7
lines changed

4 files changed

+55
-7
lines changed

Directory.Packages.props

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
</ItemGroup>
99
<ItemGroup Label="Infrastructure">
1010
<PackageVersion Include="Azure.Storage.Blobs" Version="12.22.2" />
11-
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.0-rc.2.24474.1" />
12-
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.0-rc.2.24474.1" />
13-
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.0-rc.2.24474.1" />
11+
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="8.0.10" />
12+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.10" />
13+
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.10" />
1414
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="9.0.0-rc.2.24474.3" />
1515
<PackageVersion Include="MongoDB.Driver" Version="2.30.0" />
16-
<PackageVersion Include="MySql.EntityFrameworkCore" Version="9.0.0-preview" />
16+
<PackageVersion Include="MySql.EntityFrameworkCore" Version="8.0.8" />
1717
<PackageVersion Include="RavenDB.Client" Version="6.2.1" />
1818
</ItemGroup>
1919
<ItemGroup Label="Web">
@@ -41,4 +41,4 @@
4141
<PackageVersion Include="xunit.v3" Version="0.5.0-pre.27" />
4242
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.0-pre.42" />
4343
</ItemGroup>
44-
</Project>
44+
</Project>

src/LinkDotNet.Blog.Infrastructure/Persistence/Sql/Mapping/BlogPostConfiguration.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
1+
using System;
2+
using System.Text.Json;
13
using LinkDotNet.Blog.Domain;
24
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.EntityFrameworkCore.Infrastructure;
36
using Microsoft.EntityFrameworkCore.Metadata.Builders;
7+
using MySql.EntityFrameworkCore.Extensions;
48

59
namespace LinkDotNet.Blog.Infrastructure.Persistence.Sql.Mapping;
610

711
internal sealed class BlogPostConfiguration : IEntityTypeConfiguration<BlogPost>
812
{
13+
private readonly DatabaseFacade databaseFacade;
14+
15+
public BlogPostConfiguration(DatabaseFacade databaseFacade)
16+
=> this.databaseFacade = databaseFacade;
17+
918
public void Configure(EntityTypeBuilder<BlogPost> builder)
1019
{
1120
builder.HasKey(c => c.Id);
@@ -19,7 +28,14 @@ public void Configure(EntityTypeBuilder<BlogPost> builder)
1928
builder.Property(x => x.ShortDescription).IsRequired();
2029
builder.Property(x => x.Likes).IsRequired();
2130
builder.Property(x => x.IsPublished).IsRequired();
22-
builder.Property(x => x.Tags).HasMaxLength(2096);
31+
32+
var tags = builder.Property(x => x.Tags).HasMaxLength(2048);
33+
34+
if (databaseFacade.IsMySql())
35+
{
36+
// MySQL EF Driver does not support arrays out of the box so we have to json serialize and deserialize them
37+
tags.HasConversion<JsonArrayConverter>();
38+
}
2339

2440
builder.HasIndex(x => new { x.IsPublished, x.UpdatedDate })
2541
.HasDatabaseName("IX_BlogPosts_IsPublished_UpdatedDate")
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text.Json;
4+
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
5+
6+
namespace LinkDotNet.Blog.Infrastructure.Persistence.Sql.Mapping;
7+
8+
internal sealed class JsonArrayConverter : ValueConverter<IList<string>, string>
9+
{
10+
public JsonArrayConverter() : base(
11+
v => JsonSerializer.Serialize(v, JsonSerializerOptions.Default),
12+
v => JsonSerializer.Deserialize<string[]>(v, JsonSerializerOptions.Default) ??
13+
Array.Empty<string>())
14+
{
15+
}
16+
}
Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,33 @@
11
using LinkDotNet.Blog.Domain;
22
using Microsoft.EntityFrameworkCore;
3+
using Microsoft.EntityFrameworkCore.Infrastructure;
34
using Microsoft.EntityFrameworkCore.Metadata.Builders;
5+
using MySql.EntityFrameworkCore.Extensions;
46

57
namespace LinkDotNet.Blog.Infrastructure.Persistence.Sql.Mapping;
68

79
internal sealed class SimilarBlogPostConfiguration : IEntityTypeConfiguration<SimilarBlogPost>
810
{
11+
private readonly DatabaseFacade database;
12+
13+
public SimilarBlogPostConfiguration(DatabaseFacade database)
14+
=> this.database = database;
15+
916
public void Configure(EntityTypeBuilder<SimilarBlogPost> builder)
1017
{
1118
builder.HasKey(b => b.Id);
1219
builder.Property(b => b.Id)
1320
.IsUnicode(false)
1421
.ValueGeneratedOnAdd();
15-
builder.Property(b => b.SimilarBlogPostIds).HasMaxLength(450 * 3).IsRequired();
22+
23+
var similarBlogPosts = builder
24+
.Property(b => b.SimilarBlogPostIds)
25+
.HasMaxLength(450 * 3)
26+
.IsRequired();
27+
28+
if (database.IsMySql())
29+
{
30+
similarBlogPosts.HasConversion<JsonArrayConverter>();
31+
}
1632
}
1733
}

0 commit comments

Comments
 (0)