如何配置 EF Core 以将 Enum 序列化为 Cosmos DB 中的字符串以获取复杂属性

问题描述 投票:0回答:1

我正在 .NET 项目中使用 EF Core 和 Azure Cosmos DB。我有一个 User 实体,其中包含 AuditStandardUserInfo 实体的集合。 User 实体和 AuditStandardUserInfo 实体都有一个 AuditCompetence 类型(枚举)的 Competence 属性。我想配置 EF Core 以将 Competence 属性序列化为 Cosmos DB 中的字符串,但我迄今为止尝试过的建议解决方案遇到了问题。

这是我的代码的相关部分:

public enum AuditCompetence
{
    None,
    Low,
    Medium,
    High
}

public class User
{
    public string UserId { get; set; } = Guid.NewGuid().ToString();
    // ... other properties ...
    public ICollection<AuditStandardUserInfo> UserAuditStandards { get; set; } = new List<AuditStandardUserInfo>();
    public AuditCompetence? Competence { get; set; }
}

public class AuditStandardUserInfo
{
    public string AuditStandardId { get; set; }
    // ... other properties ...
    public AuditCompetence Competence { get; set; }
}

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // ... configuration code ...
    }
}

我尝试在 OnModelCreating 方法中使用 HasConversion() 方法,以及将 Newtonsoft.Json 库中的 [JsonConverter(typeof(StringEnumConverter))] 属性应用到 AuditCompetence 枚举,但这些解决方案都不适合我。只有直接位于 User 下的枚举才被 HasConversation() 正确转换,而不是 UserAuditStandards 中的枚举

有人可以指导我如何正确配置 EF Core 以将 Competence 属性序列化为 Cosmos DB 中的字符串(对于用户实体和 AuditStandardUserInfo 实体)吗?

json entity-framework-core azure-cosmosdb
1个回答
0
投票

如何配置 EF Core 以将 Enum 序列化为 Cosmos DB 中的字符串以获取复杂属性

以下是我遵循的步骤:

  • 定义了实体类 UserAuditStandardUserInfo

  • User 类具有一个名为

    Competence
    且类型为
    AuditCompetence
    的属性,您希望将其序列化为 Cosmos DB 中的字符串。

  • DbContext的子类称为MyDbContext用于控制数据库交互。

  • 它有两个

    DbSet
    属性,称为 UsersAuditStandardUserInfos,表示相应实体类型的数据库表。

  • EF Core Cosmos DB 提供程序提供的

    UseCosmos
    方法用于在
    OnConfiguring
    方法中配置 Cosmos DB 连接。

  • OnModelCreating
    方法中,配置数据库的模型。

  • 使用

    Competence
    方法将
    User
    实体的
    .HasConversion<string>()
    字段设置为在存储到数据库时转换为字符串。这是确保枚举在 Cosmos DB 中序列化为字符串的方法。

下面是我尝试过的代码:

public enum AuditCompetence
{
    None,
    Low,
    Medium,
    High
}

public class User
{
    public string UserId { get; set; } = Guid.NewGuid().ToString();
    
    public AuditCompetence? Competence { get; set; }
}

public class AuditStandardUserInfo
{
    public string AuditStandardId { get; set; }
    public AuditCompetence Competence { get; set; }
    public string UserId { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<AuditStandardUserInfo> AuditStandardUserInfos { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string endpoint = "*****";
        string key = "*****";
        string databaseName = "Database";
        string containerName = "Container";

        optionsBuilder.UseCosmos(
            endpoint,
            key,
            databaseName,
            options =>
            {
                options.ConnectionMode(Microsoft.Azure.Cosmos.ConnectionMode.Gateway);
            });
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .Property(u => u.Competence)
            .HasConversion<string>();

        modelBuilder.Entity<AuditStandardUserInfo>().HasNoKey();
    }
}

输出:

{
    "UserId": "e21ceaa4-f54c-46f0-8d12-05fe47745c12",
    "Competence": "High",
    "Discriminator": "User",
    "id": "User|e21ceaa4-f54c-46f0-8d12-05fe47745c12",
}
© www.soinside.com 2019 - 2024. All rights reserved.