Errors compiling optimized DbContext that contains fixed length property
Steps to reproduce:
- In an empty folder, create a new console application:
dotnet ef console - Replace Program.cs with the following code:
using Microsoft.EntityFrameworkCore;
Console.WriteLine("Hello world!");
public class Entity
{
public int Id { get; set; }
public string? Name { get; set; }
}
public class ApplicationDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseNpgsql();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>().Property(t => t.Name).HasMaxLength(10).IsFixedLength();
}
}
- Execute
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL - Execute
dotnet add package Microsoft.EntityFrameworkCore.Design - Execute
dotnet new tool-manifest - Execute
dotnet tool install dotnet-ef - Execute
dotnet ef dbcontext optimize - Execute
dotnet build
Expected behavior: the application will compile.
Actual behavior: compilation errors:
D:\ghbug\CompiledModels\EntityEntityType.cs(58,78): error CS0117: 'NpgsqlCharacterStringTypeMapping' does not contain a definition for 'EqualsWithoutTrailingWhitespace' [D:\ghbug\ghbug.csproj]
D:\ghbug\CompiledModels\EntityEntityType.cs(59,68): error CS0117: 'NpgsqlCharacterStringTypeMapping' does not contain a definition for 'GetHashCodeWithoutTrailingWhitespace' [D:\ghbug\ghbug.csproj]
D:\ghbug\CompiledModels\EntityEntityType.cs(62,78): error CS0117: 'NpgsqlCharacterStringTypeMapping' does not contain a definition for 'EqualsWithoutTrailingWhitespace' [D:\ghbug\ghbug.csproj]
D:\ghbug\CompiledModels\EntityEntityType.cs(63,68): error CS0117: 'NpgsqlCharacterStringTypeMapping' does not contain a definition for 'GetHashCodeWithoutTrailingWhitespace' [D:\ghbug\ghbug.csproj]
D:\ghbug\CompiledModels\EntityEntityType.cs(66,78): error CS0117: 'NpgsqlCharacterStringTypeMapping' does not contain a definition for 'EqualsWithoutTrailingWhitespace' [D:\ghbug\ghbug.csproj]
D:\ghbug\CompiledModels\EntityEntityType.cs(67,68): error CS0117: 'NpgsqlCharacterStringTypeMapping' does not contain a definition for 'GetHashCodeWithoutTrailingWhitespace' [D:\ghbug\ghbug.csproj]
This technique worked with Npgsql.EntityFrameworkCore.PostgreSQL version 7.0 but stopped working with 8.0 in which these methods were removed.
I get the same error and also "'NpgsqlCharacterStringTypeMapping' does not contain a definition for 'EqualsWithoutTrailingWhitespace'"
I'm not sure whether the authors ignoring us, but meanwhile I have the following "polyfill" that can be added to the project to resolve the problem: https://gist.github.com/miegir/63961ebdc117ed74e1dd79a5f5afd190.
@miegir definitely not ignoring you, but there's a massive amount of work going on. I'll try to get to this for 8.0.1 or 8.0.2 at the latest.
Hi @roji, not sure if this helps but it seems to occur on properties that have IsFixedLength", true
I'm not sure whether the authors ignoring us, but meanwhile I have the following "polyfill" that can be added to the project to resolve the problem: https://gist.github.com/miegir/63961ebdc117ed74e1dd79a5f5afd190.
Thank you so much! I placed the class in the same namespace as my optimized model and it has resolved my errors.
My naïve PR for this problem would be to simply make the EqualsWithoutTrailingWhitespace and GetHashCodeWithoutTrailingWhitespace methods public
I ran into this as well on the brand new 8.0.2 just a heads up to anyone trying to make compiled models
+1, Just ran into it today on 8.0.2
Fixed in 51faf6e9c9c7ef99c3e98d98a96adb8fa8ae4553