我正在 .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 实体)吗?
如何配置 EF Core 以将 Enum 序列化为 Cosmos DB 中的字符串以获取复杂属性
以下是我遵循的步骤:
定义了实体类 User 和 AuditStandardUserInfo。
User 类具有一个名为
Competence
且类型为 AuditCompetence
的属性,您希望将其序列化为 Cosmos DB 中的字符串。
DbContext的子类称为MyDbContext用于控制数据库交互。
它有两个
DbSet
属性,称为 Users 和 AuditStandardUserInfos,表示相应实体类型的数据库表。
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",
}