json Azure Cosmos DB(EF/Core)- Camel Case属性名称

nzkunb0c  于 2023-05-30  发布在  其他
关注(0)|答案(4)|浏览(99)

我有一个.NET Core 3.1 API项目,它通过实体框架(Microsoft.EntityFrameworkCore.Cosmos - v3.1.5)处理Cosmos DB存储。
我有一个数据库模型:

[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))]
public class BikeRental
{
    [JsonProperty(PropertyName = "id")]
    [Key]
    public Guid Id { get; set; }

    [JsonProperty(PropertyName = "bikeId")]
    public string BikeId { get; set; }

    [JsonProperty(PropertyName = "shopId")]
    public string ShopId { get; set; }
}

在保存到CosmosDB数据库时,将使用类属性名称序列化列,忽略“PropertyName”属性。例如,如果将“bikeId”更改为“testBikeId”,则仍将其写入为“BikeId”。

{
    "Id": "192dfdf4-54cb-4290-a478-7035518983ca",
    "BikeId": "eb65b93b-17d3-4829-9729-d48c029211fe2",
    "ShopId": "636c08c4-600d-458a-98b7-8d312b8c18d2",

    "_rid": "2QZIAMVYbVQBAAAAAAAAAA==",
    "_self": "dbs/2QZIAA==/colls/2QZIAMVYbVQ=/docs/2QZIAMVYbVQBAAAAAAAAAA==/",
    "_etag": "\"00000000-0000-0000-4627-f721b0e701d6\"",
    "_attachments": "attachments/",
    "_ts": 1592564051
}

任何帮助或建议如何解决这个问题将不胜感激!
编辑:通过以下方式将对象保存到Cosmos:

var response = _context.BikeRentals.Add(obj)
_context.SaveChanges();
lztngnrs

lztngnrs1#

OnModelCreating方法中使用Fluent API进行模型配置:

modelBuilder.Entity<BikeRental>().Property(x => x.Id).ToJsonProperty("id");
modelBuilder.Entity<BikeRental>().Property(x => x.BikeId).ToJsonProperty("bikeId");
modelBuilder.Entity<BikeRental>().Property(x => x.ShopId).ToJsonProperty("shopId");
vmpqdwk3

vmpqdwk32#

对于EFMap,使用ColumnAttribute或使用OnModelCreating中的fluent配置。
在Cosmos的情况下,您可能希望数据库中的名称与序列化以发送到客户端时的名称相同,但在一般情况下,您的实体可能会以不同于JSON序列化的方式Map到数据库。
您应该使用Fluent API并迭代所有实体类型和属性,并应用Pascal-to-Camel-Case转换。

shstlldc

shstlldc3#

id的问题是由于没有添加

modelBuilder.Entity<BikeRental>().HasNoDiscriminator();

如果你添加了这个,它应该只创建id

pvcm50d1

pvcm50d14#

我想出了一个扩展方法来处理这个问题

public static void CamelCasePropertyNames<T>(this EntityTypeBuilder<T> entity)
        where T : class
    {       
        foreach (var property in typeof(T).GetProperties())
        {
            entity.Property(property.Name)
                .ToJsonProperty(char.ToLowerInvariant(property.Name[0]) + property.Name.Substring(1));
        }
    }

相关问题