json 如何在Cosmos DB中配置EF Core以将枚举序列化为字符串以处理复杂属性

igsr9ssn  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(107)

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

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,以便在Cosmos DB中将Competence属性序列化为字符串,同时用于User实体和AuditStandardUserInfo实体?

pu3pd22g

pu3pd22g1#

如何在Cosmos DB中配置EF Core以将枚举序列化为字符串以处理复杂属性

以下是我的步骤:

  • 定义了实体类UserAuditStandardUserInfo
    *User类有一个名为CompetenceAuditCompetence类型的属性,您希望在Cosmos DB中将其序列化为字符串。
    *DbContext的子类MyDbContext用于控制数据库交互。
  • 它有两个名为UsersAuditStandardUserInfosDbSet属性,表示相应实体类型的数据库表。
  • EF Core Cosmos DB提供程序提供的UseCosmos方法用于配置OnConfiguring方法中的Cosmos DB连接。
  • OnModelCreating方法中,配置数据库的模型。
  • User实体的Competence字段被设置为在使用.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",
}

相关问题