我遵循了documentation on Postgres C# website。
运行此代码时,我得到:
实体类型“ Bar”要求定义主键。
POCO:
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; }
}
我的目标是避免使用string
作为Bar的属性类型,而让实体框架处理JSON序列化,反序列化。我不希望Bar
是一个单独的表。我希望它成为Foo
上的JSON列。
答案 0 :(得分:3)
您需要在ValueConverter<Bar, string>
上的HasConversion
中创建OnModelCreating
或直接使用函数表达式。
示例:
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);
}
参考: https://docs.microsoft.com/en-us/ef/core/modeling/value-conversions
答案 1 :(得分:0)
从2.2升级到.NET Core 3.0之后,一切正常。以下是新的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>
答案 2 :(得分:0)
我遇到了.NET Core 2.1和MySQL的问题,这就是为我解决的问题。我目前无法更新到3.0。添加“忽略”是解决我的问题的部分。
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");
}