【问题标题】:Querying tags with Cosmos DB with EF Core使用 EF Core 使用 Cosmos DB 查询标签
【发布时间】:2021-02-16 22:53:47
【问题描述】:

我有一个使用 EF Core 和 Cosmos DB 提供程序持久化的域模型。问题是,我想向它添加我想查询的标签,例如,返回所有具有此标签的条目。不幸的是,Cosmos DB 不支持字符串数组(以及其他),所以我只能想象使用单个字符串属性,这远非理想,因为如果我需要多个标签,我需要将它们组合在同一个属性上,可能是分开的通过空格,这将使查询一个单一的非常困难。实现这一目标的最佳选择是什么?

【问题讨论】:

    标签: .net-core entity-framework-core azure-cosmosdb


    【解决方案1】:

    这是 EF Core 的限制,而不是 Cosmos DB - 禁止具有字符串数组属性的实体。 为了解决这个问题,我只使用了 Cosmos DB API 并删除了 EF Core。

    【讨论】:

      【解决方案2】:

      你可以创建一个 POCO:

      public class Tag
      {
          public string Name { get; set; }
      }
      

      那么你的模型类看起来像这样:

      public class MyEntity
      {
          public string Id { get; set; }
          public string Name { get; set; }
          public List<Tag> Tags { get; set; }
      }
      

      指示 EF 如何通过覆盖 OnModelCreating() 或使用单独的配置文件来处理模型:

      // Configure the one-to-many/owns many relationship:
      builder
         .OwnsMany(
            ownedType: typeof(Tag),
            navigationName: nameof(MyEntity.Tags))
         .WithOwner();
      

      这将产生如下内容:

      {
          "Id": "some-unique-id",
          "Name": "The name of the entity",
          "Tags": [
              {
                  "Name": "Developer"
              },
              {
                  "Name": "Hacker"
              },
              {
                  "Name": "Guru"
              } 
          ]
      }
      

      或者,您可以像这样定义一个简单的转换:

      builder.Property(c => c.Tags)
          .HasConversion(
              v => string.Join(',', v),
              v => v.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList()
          );
      

      这将允许根据需要查询字符串列表,但在数据库中作为逗号分隔的字符串值保留。虽然这可能没问题,但您会在 Cosmos Db 中失去一些查询能力。

      注意:您可能还需要实现一个比较器,以便 EF 正确跟踪更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多