sqlite 为什么我不能将子项数组Map到JSON?

cxfofazt  于 2023-08-06  发布在  SQLite
关注(0)|答案(1)|浏览(99)

我的代码(.NET 8.0 preview 6)允许在SQLite中使用ToJson()

using Microsoft.EntityFrameworkCore;

var ctx = new TestContext();
ctx.Database.EnsureCreated();
ctx.Items.ToArray();

class TestContext : DbContext
{
    public DbSet<TestItem> Items { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=test.db");
        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TestItem>().OwnsMany(ti => ti.Children, builder => builder.ToJson());
    }
}

class TestItem
{
    public required int Id { get; set; }
    public required string Name { get; set; }
    public required List<TestChild> Children { get; set; }
}

class TestChild
{
    public required int Id { get; set; }
    public required string Name { get; set; }
}

个字符
加载(空)items表时出现以下错误:
抛出的异常:System.Linq.Expressions.dll中的“System. ArgumentException”System.Linq.Expressions.dll中发生“System.ArgumentException”类型的未处理异常“System.Object”类型的表达式不能用于分配给类型“System.Int32”
这似乎与儿童名单有关。我可以用一个孩子(而不是孩子)做一个类似的模型。此时数据库是空的,所以它不是关于加载的数据内容。

sg3maiej

sg3maiej1#

问题出在TestChildId属性上。有一些关于名为Id或后缀为Id的属性的约定(例如,它们被发现为PK)。如果您将列类型更改为string,并尝试保存和阅读列中的数据,您将收到一条描述问题的消息:
System.InvalidOperationException:实体类型“TestChild”是Map到JSON的集合的一部分,并且显式定义了其序号键。只支持隐式定义的序数键。
将列重命名为类似Identifiactor的内容:

class TestChild
{
    public required int Identifiactor { get; set; }
    public required string Name { get; set; }
}

字符串
也可以在github上查看Columns with name "Id" in JSon object causes System.ArgumentException in materialization问题:
属于集合一部分的所有类型具有名为“Id”的int类型的硬编码序号键。
请注意,作为解决方法,您可以使用JsonPropertyName属性(似乎被EF Core忽略):

class TestChild
{
    [JsonPropertyName("Id")]
    public required int SomeInt { get; set; }
    public required string Name { get; set; }
}

相关问题