Reputation: 1570
I followed the documentation on Postgres C# website.
When I run this code I get:
The entity type 'Bar' requires a primary key to be defined.
POCOs:
public class Foo
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
[Column(TypeName = "jsonb")]
public Bar Bar { get; set; }
}
public class Bar
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
My goal is to avoid using string
as a property type of Bar and let the entity framework handle JSON serialize, deserialize. I don't want the Bar
to be a separate table. I want it to be a JSON column on Foo
.
Upvotes: 4
Views: 830
Reputation: 1328
I ran into this issue with .NET Core 2.1 and MySQL and this is what resolved it for me. I'm not able to update to 3.0 at this time. Adding Ignore was the part that solved my problem.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Ignore<Bar>();
modelBuilder.Entity<Foo>()
.Property(x => x.Bar)
.HasConversion(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<Bar>(v))
.HasColumnType("json");
}
Upvotes: 2
Reputation: 1570
After upgrading to .NET Core 3.0 from 2.2 everything worked fine. The following is the new csproj:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<AssemblyName>App</AssemblyName>
<RootNamespace>App</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="3.0.0" />
</ItemGroup>
</Project>
Upvotes: 0
Reputation: 1361
You need to create ValueConverter<Bar, string>
or use function expressions directly in HasConversion
in on OnModelCreating
.
Example:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Foo>()
.Property(x => x.Bar)
.HasConversion(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<Bar>(v));
base.OnModelCreating(modelBuilder);
}
Reference: https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions
Upvotes: 4