Azure Cosmos DB(EF/Core)-驼峰式属性名称

Posted

技术标签:

【中文标题】Azure Cosmos DB(EF/Core)-驼峰式属性名称【英文标题】:Azure Cosmos DB (EF/Core) - Camel Case Property Names 【发布时间】: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();

【问题讨论】:

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

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

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

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

【讨论】:

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

以上是关于Azure Cosmos DB(EF/Core)-驼峰式属性名称的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure MSI 的身份服务器 EF Core DB 配置

通过 EF Core 自动创建时的默认 Azure SQL DB 定价

sql Azure Cosmos DB

Azure 流分析输出到 Azure Cosmos DB

无法使用 Microsoft.EntityFrameworkCore.Cosmos 连接到 Azure Cosmos Db 帐户 - 响应状态代码

Cosmos DB 更改源触发 Azure 函数:租赁丢失异常