使用postgres的dotnet core 2.2 EntityFramework

时间:2019-09-26 19:22:32

标签: c# .net-core entity-framework-core

我遵循了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列。

3 个答案:

答案 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");
    }