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