【问题标题】:dotnet core 2.2 EntityFramework with postgresdotnet core 2.2 EntityFramework 与 postgres
【发布时间】:2020-01-27 03:00:08
【问题描述】:

我关注了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 列。

【问题讨论】:

  • 我很确定 Entity Framework 在每个表上都需要一个主键(身份)。 (stackoverflow.com/questions/3996782/…)
  • 但我希望它是一个 json 并且我不希望 Bar 成为另一个表
  • 即使它不在数据库中,它仍然需要一个主键作为 POCO 的属性 (stackoverflow.com/questions/43503424/…)
  • 我添加了 ID,它为Bar 创建了一个新表。我不想要Bar 的新表。我想使用 json 列
  • @NodeJs 查看下面的答案

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


【解决方案1】:

您需要在OnModelCreating 上直接创建ValueConverter<Bar, string> 或在HasConversion 中使用函数表达式。

例子:

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

【讨论】:

    【解决方案2】:

    从 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>
    

    【讨论】:

      【解决方案3】:

      我在 .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");
          }
      

      【讨论】:

        猜你喜欢
        • 2019-10-06
        • 1970-01-01
        • 1970-01-01
        • 2020-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        • 1970-01-01
        相关资源
        最近更新 更多