Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 使用带有EF核心的Cosmos DB查询标签_.net Core_Entity Framework Core_Azure Cosmosdb - Fatal编程技术网

.net core 使用带有EF核心的Cosmos DB查询标签

.net core 使用带有EF核心的Cosmos DB查询标签,.net-core,entity-framework-core,azure-cosmosdb,.net Core,Entity Framework Core,Azure Cosmosdb,我有一个域模型,它是用efcore和cosmosdb提供程序持久化的。问题是,我想添加标签,我想查询,例如,返回所有有这个标签的条目。不幸的是,Cosmos DB不支持字符串数组(除其他外),因此我只能想象使用单个字符串属性,这远远不理想,因为如果我需要多个标记,我需要将它们组合在同一个属性上,可能由空格分隔,这将使得查询单个属性非常困难。实现这一点的最佳选择是什么?这是EF Core的一个限制,而不是Cosmos DB-禁止具有字符串数组属性的实体。 为了解决这个问题,我只使用了Cosmos

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

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

您可以创建一个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; }
}
builder.Property(c => c.Tags)
    .HasConversion(
        v => string.Join(',', v),
        v => v.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList()
    );
这将产生如下结果:

{
    "Id": "some-unique-id",
    "Name": "The name of the entity",
    "Tags": [
        {
            "Name": "Developer"
        },
        {
            "Name": "Hacker"
        },
        {
            "Name": "Guru"
        } 
    ]
}
或者,您可以定义如下的简单转换:

public class MyEntity
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<Tag> Tags { get; set; }
}
builder.Property(c => c.Tags)
    .HasConversion(
        v => string.Join(',', v),
        v => v.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList()
    );
这将允许根据需要查询字符串列表,但会在数据库中作为逗号分隔的字符串值持久化。虽然这可能没问题,但您将在Cosmos Db中失去一些查询能力

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