.net core 如何存储IEnumerable<;的属性;字符串>;在宇宙表中,EF Core 3.1

.net core 如何存储IEnumerable<;的属性;字符串>;在宇宙表中,EF Core 3.1,.net-core,entity-framework-core,azure-cosmosdb,.net Core,Entity Framework Core,Azure Cosmosdb,我的项目使用EF Core 3.1,目标是Azure Cosmos作为数据库 我有这样一个实体: public class MyEntity { public IEnumerable<string> Names {get;set;} ... other fields } { "Names": ["Name1", "Name2"] } { "Id": "XXXXXX", "Names:" [ {}, {}

我的项目使用EF Core 3.1,目标是Azure Cosmos作为数据库

我有这样一个实体:

public class MyEntity
{
    public IEnumerable<string> Names {get;set;}
    ... other fields
}
{
    "Names": ["Name1", "Name2"]
}
{
    "Id": "XXXXXX",
    "Names:" [
       {},
       {}
    ],
}
使用实体原样(
IEnumerable
),我得到错误:

无法映射属性“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);
    });
}
因此,我更改了onmodel创建:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyEntity>(e =>
    {
        e.OwnsMany(p => p.Identifiers, o=> o.HasKey(k=>k.Name));
    });
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
实体(e=>
{
e、 OwnsMany(p=>p.Identifiers,o=>o.HasKey(k=>k.Name));
});
}
然后我得到:

{
  "Names": [
    {
        "Name": "<string1>",
        "Id": "XXXX"
    },
    {
        "Identifier": "<string2>",
        "Id": "XXXX"
    }
]}
{
“姓名”:[
{
“名称”:“,
“Id”:“XXXX”
},
{
“标识符”:“,
“Id”:“XXXX”
}
]}
我还研究了值转换器,但我认为这更适合在类型之间转换属性值,而不是将实体转换为字符串


任何帮助都将不胜感激。

这里有一个与您类似的问题:

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

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

正如上面的链接所解释的,您可以在OnModelCreating方法中执行以下操作:

modelBuilder.Entity<YourEntity>()
        .Property(e => e.Strings)
        .HasConversion(
            v => string.Join(',', v),
            v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));
modelBuilder.Entity()
.Property(e=>e.Strings)
.哈斯转换(
v=>string.Join(“,”,v),
v=>v.Split(',',StringSplitOptions.RemoveEmptyEntries));

列表或数组之类的东西是否不适合您的情况。IEnumerable类型背后的想法是什么?想法是让json“看起来不错”。列表和数组可以转换为IEnumerable,所以不太可能工作,但可以尝试一下。有人明确告诉我不要创建CSV:-)我确实想出了一个解决方案,涉及到对Cosmos驱动程序的更改。我设法让它在写入Cosmos时正常工作,但在读取时有点不正常。如果我能让阅读变得更好,我可能会把它作为公关提交。