【问题标题】:Mapping json in EF Core 3在 EF Core 3 中映射 json
【发布时间】:2020-05-15 17:18:45
【问题描述】:

City 有商店和公园的列表。 我想在 sql server 中将 store 对象保存为 json。

public class City{
    public int Id { get; set; }
    ... 
    public ICollection<Store> Stores { get; set; }
    public ICollection<Park> Parks { get; set; }

    public City{
        Stores = new List<Store>();
        Parks = new List<Park>();
    }
}

public class Store{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Park{
    public int Id { get; set; }
    public int CityId { get; set; }
    public string Name { get; set; }
}

public class CityConfiguration : IEntityTypeConfiguration<City>
{
    public void Configure(EntityTypeBuilder<City> builder)
    {
        builder.ToTable("Cities");
        builder.HasKey(x => x.Id);

        builder.Property(e => e.Stores).HasConversion(
            v => JsonConvert.SerializeObject(v, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }),
            v => JsonConvert.DeserializeObject<IList<Store>>(v, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));

        builder.HasMany(e => e.Parks)
            .WithOne(x => x.City)
            .HasForeignKey(f => f.CityId);
    }
}

在测试数据库上下文中播种数据时,我正在填充这样的 Store 对象

modelBuilder.Entity<Park>(s =>
{
    s.HasData(new Park{ Name = "Park name", CityId = 1, Id = 1 });
});    

modelBuilder.Entity<Store>(s =>
{
    s.HasData(new Store{ Name = "Store name", Id = 1 });
});

检索数据时

var res = _db.Cities.Where(x => x.Id == id)
                .Include(x => x.Parks)  // this works fine           
                .Include(x => x.Stores) // this issues exception
                .FirstOrDefault();

System.InvalidOperationException : 内部使用的 Lambda 表达式 包含无效。

我正在使用 .net core 3.1.3

【问题讨论】:

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


    【解决方案1】:

    由于您将 City.Stores 集合保存为 JSON 序列化字符串,因此您不能将其用作子对象的导航集合。你需要去掉查询语句中的.Include(x =&gt; x.Stores)

    var res = _db.Cities.Where(x => x.Id == id)
                    .Include(x => x.Parks)  // this works fine           
                    .FirstOrDefault();
    

    【讨论】:

    • 感谢您的努力,但完全删除 Include(x=>x.Stores) 最终不会获取任何内容。商店集合为空。
    • 您是否验证过 City 表的 Stores 字段中实际上有一个字符串值?在CityConfiguration.Configure方法中设置断点,看看从数据库来的字符串值是什么。
    • 要调试转换,您可以定义自己的静态方法,该方法除了执行JsonSerializer 调用之外什么都不做。在CityConfiguration.Configure 方法中传递对您为.HasConversion 方法定义的静态方法的引用。
    猜你喜欢
    • 2015-01-13
    • 2020-05-07
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2021-11-18
    • 2022-01-25
    相关资源
    最近更新 更多