如何使用<string> EF Core 3.1 在 Cosmos 表中存储 IEnumerable 的属性



>我的项目正在使用EF Core 3.1,并将Azure Cosmos作为数据库。

我有一个这样的实体:

public class MyEntity
{
public IEnumerable<string> Names {get;set;}
... other fields
}

我想在这样的 Cosmos 文档中结束:

{
"Names": ["Name1", "Name2"]
}

实体按原样(IEnumerable<string>(出现错误:

无法映射属性"MyEntity.Names",因为它的类型为"IEnumerable",它不是受支持的基元类型或有效的实体类型。

如果我将实体更改为:

public class NameEntity
{
public string Name {get;set;}
}
public class MyEntity
{
public IEnumerable<NameEntity> Names {get;set;}
... other fields
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>(e =>
{
e.OwnsMany(p => p.Identifiers);
});
}

文档如下所示:

{
"Id": "XXXXXX",
"Names:" [
{},
{}
],
}

所以我改变了OnModelCreateing:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>(e =>
{
e.OwnsMany(p => p.Identifiers, o=> o.HasKey(k=>k.Name));
});
}

然后我得到:

{
"Names": [
{
"Name": "<string1>",
"Id": "XXXX"
},
{
"Identifier": "<string2>",
"Id": "XXXX"
}
]}

我也看过值转换器,但我认为这更多地是为了在类型之间转换属性值,而不是将实体转换为字符串。

任何帮助将不胜感激。

这里有一个和你类似的问题:实体框架 - 代码优先 - 无法存储列表<字符串>

目前,无法存储基元类型(包括字符串(的列表。

最好的办法是将列表作为字符串存储在数据库中,并在获取它时将其转换回列表。

正如上面的链接所解释的那样,您可以在OnModelCreate方法中进行操作:

modelBuilder.Entity<YourEntity>()
.Property(e => e.Strings)
.HasConversion(
v => string.Join(',', v),
v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));

最新更新