【问题标题】:How do I make SQLite work with a JsonObject field?如何使 SQLite 与 JsonObject 字段一起工作?
【发布时间】:2019-05-15 21:26:42
【问题描述】:

我们将 EF Core MySQL (Pomelo) 用于 .NET Core 项目,并且我们有一个使用 SQLite 内存数据库的 xUnit 测试设置。我们正在配置一个在 MySQL 中可以正常工作但在我们的测试中不起作用的 JSON 列。正如您在下面看到的,我们尝试在测试期间添加一个 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 字段?

【问题讨论】:

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


    【解决方案1】:

    Dan,考虑到所有因素,我考虑过的建议是,如果您在生产中使用 MySQL 进行单元测试,那么您将使用它。否则,您会遇到几个重大危险:

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

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

    【讨论】:

    • 我同意这个建议并推荐使用 Docker 来运行 MySQL(而不是在开发机器上安装成熟的服务器),例如 docker run --name mysql -e MYSQL_ROOT_PASSWORD=test -p 3306:3306 -d mysql:5.7
    • 这个非常好的输入,我们决定在单元测试期间模拟数据库,因为这使它成为适合我们案例的单元测试。然后我们将使用 MySQL 进行集成测试。
    • 只是在搜索类似问题时看到这个。使用 docker mysql 比在内存中慢大约十亿倍。当您拥有足够大的团队和自动化 CI 管道时,您不能等待一个小时来运行单元测试。对于这种情况,您应该进行较少数量的验收/集成测试。
    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2021-12-19
    • 2012-05-29
    相关资源
    最近更新 更多