当我的.NET类用PascalCasing命名时,我如何在cosmos/EF中强制camelCasing?

m4pnthwp  于 2023-02-06  发布在  .NET
关注(0)|答案(1)|浏览(88)

我在尝试从cosmos查询数据时遇到此错误:
实体类型“DataModel”的分区键设置为“partitionKey”,但没有具有该名称的属性。
下面是我的DataModel类的外观:

public class DataModel
    {
        /* Properties - Serializable */
        public string Id { get; set; } = string.Empty;
        public int? Index { get; set; } = null;
        public string? PartitionKey { get; set; } = null;
        public string Name { get; set; } = string.Empty;
        public bool Locked { get; set; } = false;
        public string? LockedUser { get; set; } = null;
        public List<Record> Records { get; set; } = new List<Record>();
        public List<Field> Fields { get; set; } = new List<Field>();

        /* Properties - Not-Serializable */
        [JsonIgnore]
        [NotMapped]
        public Record? RootRecord = null;
        [JsonIgnore]
        [NotMapped]
        public BehaviorSubject<Record?> RootRecordBH = new BehaviorSubject<Record?>(null);
    }

下面是我实现OnModelCreating的方法:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<DataModel>().Property(x => x.Id).ToJsonProperty("id");
            modelBuilder.Entity<DataModel>().Property(x => x.Index).ToJsonProperty("index");
            modelBuilder.Entity<DataModel>().Property(x => x.PartitionKey).ToJsonProperty("partitionKey");
            modelBuilder.Entity<DataModel>().Property(x => x.Name).ToJsonProperty("name");
            modelBuilder.Entity<DataModel>().Property(x => x.Locked).ToJsonProperty("locked");
            modelBuilder.Entity<DataModel>().Property(x => x.LockedUser).ToJsonProperty("lockedUser");
            modelBuilder.Entity<DataModel>().Property(x => x.Records).ToJsonProperty("records");
            modelBuilder.Entity<DataModel>().Property(x => x.Fields).ToJsonProperty("fields");
            modelBuilder.Entity<DataModel>()
                .ToContainer("DataModels")
                .HasPartitionKey("partitionKey");
        }

我的理解是,在使用EF/EFCore时,可以通过使用OnModelBuilding()中的.ToJsonProperty来控制cosmos中的属性名称,尽管这似乎什么也没做。

gdx19jrr

gdx19jrr1#

我尝试执行有问题的共享代码,并能够以camelCasing格式将数据保存在CosmosDB中。我的数据模型类具有PascalCasing。
代码中所做的唯一更改是.HasPartitionKey(x=>x.PartitionKey);,正如Jeremy Lakeman在注解中提到的那样,HasPartitionKey方法接受模型属性名称,而不是json名称。
也可以执行下面我用过的nuget包的代码和它们各自的版本。

相关问题