如何使SQLite与JsonObject字段一起使用?

时间:2018-12-14 15:27:10

标签: c# mysql json sqlite asp.net-core

我们将EF Core MySQL(Pomelo)用于.NET Core项目,并且我们具有使用SQLite内存数据库的xUnit测试设置。我们正在配置一个JSON列,该列在MySQL中工作正常,但在我们的测试中不起作用。正如我们在下面看到的那样,我们尝试在测试过程中添加ValueConverter,以使SQLite改为将JsonObject视为字符串,但似乎被完全忽略了。我们还尝试将列类型强制为“ varchar(MAX)”。

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

如何使SQLite与JsonObject字段一起使用?

1 个答案:

答案 0 :(得分:1)

Dan,考虑到所有因素,我向您推荐的建议是,如果您在生产中使用了 MySQL ,则应将其用于单元测试。否则,您会遇到几个重大危险:

  • 测试情况与生产情况不符-MySQL和SQLite在处理数据类型方面有很大不同。
  • 源代码中充斥着仅用于处理两种数据库类型(测试和生产情况之间的)之间的“阻抗不匹配”的代码。
  • “您测试的内容”和正确测试的内容“是测试用例代码”。因此,生产案例中的问题会一直存在,直到– (ick ...) –生产部署之前才发现。

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