gpt4 book ai didi

.net-core - 如何使用 EF Core 3.1 在 Cosmos 表中存储 IEnumerable 的属性

转载 作者:行者123 更新时间:2023-12-04 17:27:15 25 4
gpt4 key购买 nike

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

我有一个这样的实体:

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

我想以这样的 Cosmos 文档结尾:
{
"Names": ["Name1", "Name2"]
}

使用实体( IEnumerable<string> )我收到错误:

The property 'MyEntity.Names' could not be mapped, because it is of type 'IEnumerable' which is not a supported primitive type or a valid entity type.



如果我将实体更改为:
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:" [
{},
{}
],
}

所以我改变了 OnModelCreating:
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"
}
]}

我还研究了值转换器,但我认为这更多的是用于在类型之间转换属性值,而不是将实体转换为字符串。

任何帮助,将不胜感激。

最佳答案

这是一个与您类似的问题:Entity Framework - Code First - Can't Store List<String>
目前,无法存储原始类型列表(包括字符串)。
最好的办法是将列表作为字符串存储在数据库中,并在获取它时将其转换回列表。
正如上面的链接所解释的那样,您可以在 OnModelCreating 方法中执行以下操作:

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

关于.net-core - 如何使用 EF Core 3.1 在 Cosmos 表中存储 IEnumerable<string> 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62474945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com