我在尝试从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中的属性名称,尽管这似乎什么也没做。
1条答案
按热度按时间gdx19jrr1#
我尝试执行有问题的共享代码,并能够以camelCasing格式将数据保存在CosmosDB中。我的数据模型类具有PascalCasing。
代码中所做的唯一更改是
.HasPartitionKey(x=>x.PartitionKey);
,正如Jeremy Lakeman在注解中提到的那样,HasPartitionKey方法接受模型属性名称,而不是json名称。也可以执行下面我用过的nuget包的代码和它们各自的版本。