我的代码(.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”
这似乎与儿童名单有关。我可以用一个孩子(而不是孩子)做一个类似的模型。此时数据库是空的,所以它不是关于加载的数据内容。
1条答案
按热度按时间sg3maiej1#
问题出在
TestChild
的Id
属性上。有一些关于名为Id
或后缀为Id
的属性的约定(例如,它们被发现为PK)。如果您将列类型更改为string
,并尝试保存和阅读列中的数据,您将收到一条描述问题的消息:System.InvalidOperationException:实体类型“TestChild”是Map到JSON的集合的一部分,并且显式定义了其序号键。只支持隐式定义的序数键。
将列重命名为类似
Identifiactor
的内容:字符串
也可以在github上查看Columns with name "Id" in JSon object causes System.ArgumentException in materialization问题:
属于集合一部分的所有类型具有名为“Id”的int类型的硬编码序号键。
请注意,作为解决方法,您可以使用
JsonPropertyName
属性(似乎被EF Core忽略):型