C# 如何使SQLite与JsonObject字段一起工作?

C# 如何使SQLite与JsonObject字段一起工作?,c#,mysql,json,sqlite,asp.net-core,C#,Mysql,Json,Sqlite,Asp.net Core,我们将EF Core MySQL(Pomelo)用于一个.NET核心项目,并且我们有一个使用SQLite内存数据库的xUnit测试设置。我们正在配置一个JSON列,它在MySQL中运行良好,但在我们的测试中不起作用。正如您在下面看到的,在测试期间,我们尝试添加一个ValueConverter,以使SQLite将JsonObject视为字符串,但这似乎被完全忽略了。我们还尝试将列类型强制为“varchar(MAX)” class FooBar { [列(TypeName=“json”)] 公共Js

我们将EF Core MySQL(Pomelo)用于一个.NET核心项目,并且我们有一个使用SQLite内存数据库的xUnit测试设置。我们正在配置一个JSON列,它在MySQL中运行良好,但在我们的测试中不起作用。正如您在下面看到的,在测试期间,我们尝试添加一个ValueConverter,以使SQLite将JsonObject视为字符串,但这似乎被完全忽略了。我们还尝试将列类型强制为“varchar(MAX)”

class FooBar
{
[列(TypeName=“json”)]
公共JsonObject Foo{get;set;}
}
类FooBarDbContext:DbContext
{
公共DbSet FooBars{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder)
{
//仅在测试期间。
builder.Entity().Property(fooBar=>fooBar.Foo).HasConversion(
v=>v.ToString(),
v=>newJSONObject(v)).HasColumnType(“varchar(MAX)”;
}
}

如何使SQLite与JsonObject字段一起工作?

Dan,综合考虑,我建议您在单元测试中使用MySQL,如果您在生产中使用MySQL的话。否则,您会遇到几个重大危险:

  • 测试情况与生产环境不匹配–MySQL和SQLite在处理数据类型方面有很大的不同
  • 源代码中充斥着只用于处理两种数据库类型之间以及测试和生产情况之间的“阻抗不匹配”的代码
  • “您测试的内容”和“正确测试的内容”是测试用例代码。“因此,生产用例中的问题会逐渐消失,直到——(ick…)生产部署后才被发现

开发人员可以在自己的笔记本电脑上部署MySQL服务器,其中包含适当的测试数据,服务器IP为
127.0.0.1
。因此,在这种情况下,我建议您这样做(取而代之)。

我同意这一建议,并建议使用Docker运行MySQL(而不是在开发机器上安装完整的服务器),例如,使用
Docker运行--name MySQL-e MySQL\u ROOT\u PASSWORD=test-p 3306:3306-d MySQL:5.7
这是一个非常好的输入,我们决定在单元测试期间模拟数据库,因为这使它成为适合我们案例的适当单元测试。然后,我们将使用MySQL进行集成测试。在搜索类似问题时看到这一点。使用docker mysql的速度大约是内存中的10亿倍。当您有一个足够大的团队和一个自动化的CI管道时,您不能等待一个小时来运行单元测试。在这种情况下,您应该有少量的验收/集成测试。
class FooBar
{
  [Column(TypeName = "json")]
  public JsonObject<Dictionary<string, object>> Foo { get; set; }
}

class FooBarDbContext : DbContext
{
  public DbSet<FooBar> FooBars { get; set; }
  protected override void OnModelCreating(ModelBuilder builder)
  {
    // only during testing.
    builder.Entity<FooBar>().Property(fooBar => fooBar.Foo).HasConversion(
      v => v.ToString(),
      v => new JsonObject<Dictionary<string, object>>(v)).HasColumnType("varchar(MAX)");
  }
}