使用CosmosDB时如何解决EF不支持List<Guid>类型的报错问题?
解决EF Core CosmosDB中List主键报错问题
问题原因
EF Core默认会将List<Guid>这类集合类型识别为需要独立映射的实体类型,而非嵌入到文档中的JSON数组,因此会抛出要求定义主键的错误,这与我们直接存储Guid字符串数组的需求不符。
解决方案
通过FluentAPI配置属性的序列化规则,告诉EF Core将List<Guid>序列化为JSON字符串存储,读取时再反序列化为集合,同时设置值比较器确保EF能正确识别集合内容的变化。
完整FluentAPI配置
using System.Text.Json; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; // 配置OwnerModel builder.Entity<OwnerModel>() .ToContainer(nameof(OwnerModel)) .HasNoDiscriminator() .HasKey(o => o.Id); // 配置ProductIds属性的序列化与反序列化 builder.Entity<OwnerModel>() .Property(o => o.ProductIds) .HasConversion( // 序列化:将List<Guid>转为JSON字符串 serialize => JsonSerializer.Serialize(serialize, new JsonSerializerOptions()), // 反序列化:将JSON字符串转为List<Guid> deserialize => JsonSerializer.Deserialize<List<Guid>>(deserialize, new JsonSerializerOptions()), // 定义集合的比较规则,确保EF能正确跟踪变更 new ValueComparer<List<Guid>>( (left, right) => left.SequenceEqual(right), list => list.Aggregate(0, (hash, id) => HashCode.Combine(hash, id.GetHashCode())), list => list.ToList() ) );
效果说明
配置完成后,CosmosDB中的OwnerModel文档会将ProductIds存储为如下格式的JSON数组:
{ "Id": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "ProductIds": ["yyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy", "zzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz"] }
读取数据时,EF Core会自动将该数组反序列化为List<Guid>类型的ProductIds属性,同时不再将List<Guid>视为需要主键的实体类型,报错即可解决。
内容的提问来源于stack exchange,提问作者Randy Hall
相关产品推荐
相关产品推荐

