【问题标题】:Azure Cosmos DB (EF/Core) - Camel Case Property NamesAzure Cosmos DB(EF/Core)-驼峰式属性名称
【发布时间】:2020-10-12 04:56:57
【问题描述】:

我有一个 .NET Core 3.1 API 项目,它通过 Entity Framework (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();

【问题讨论】:

  • 你是怎么序列化的?
  • 实体框架正在执行序列化。因此,在将对象添加到相关上下文时会发生这种情况。我已编辑原始帖子以包含此信息。

标签: c# json entity-framework azure-cosmosdb


【解决方案1】:

对于 EF 映射,使用 ColumnAttribute 或使用 OnModelCreating 中的流畅配置。

对于 Cosmos,您可能希望数据库中的名称与序列化以发送到客户端时的名称相同,但在一般情况下,您的实体映射到数据库的方式可能与 JSON 序列化不同。

您应该使用Fluent API 并迭代所有实体类型和属性,然后应用 Pascal-to-Camel-Case 转换。

【讨论】:

  • 谢谢大卫。在 OnModelCreating 中添加转换已经奏效。
  • 大卫,很抱歉回到这个问题。但是,尽管我现在已经根据您的建议成功地完成了这项工作,但我遇到了另一个问题。将属性声明为 Id,然后将其正确映射到“id”。但是,出于某种原因,Cosmos 然后将类类型添加到 ID 中?例如"id": "BikeRental|01f7be19-4f0f-44d1-9fa9-721195cf2d45",
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多