在CosmosDB中为现有Record实体新增属性避免查询报错的方法
解决CosmosDB+EF Core中新增非可空属性的查询报错问题
老数据里没有新增的Val2字段,EF Core映射时找不到对应值,又因为Val2是非可空int类型,所以抛出“Nullable object must have a value.”错误。CosmosDB完全支持“属性不存在时用默认值填充、不崩溃”的需求,不用把属性改成可空类型,具体可以用这几种方法:
方法一:通过EF Core模型配置设置默认值
在DbContext的OnModelCreating方法里,给Val2指定默认值,当CosmosDB文档中没有该字段时,EF会自动用配置的默认值填充:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Record>() .Property(r => r.Val2) .HasDefaultValue(0); }
方法二:自定义值转换器处理空值
写一个值转换器,读取数据时如果遇到字段缺失导致的null,自动转为默认值0,写入时正常处理:
protected override void OnModelCreating(ModelBuilder modelBuilder) { var intConverter = new ValueConverter<int?, int>( v => v ?? 0, v => v ); modelBuilder.Entity<Record>() .Property(r => r.Val2) .HasConversion(intConverter); }
方法三:用Cosmos SQL的投影语句指定默认值
查询时直接用Cosmos SQL的COALESCE函数,给缺失的Val2字段设置默认值0,从数据库层面解决问题:
var records = await context.Records .FromSqlRaw("SELECT c.Val1, COALESCE(c.Val2, 0) AS Val2 FROM c") .ToListAsync();
这几种方法都能实现需求,不需要修改实体属性的可空性。
内容的提问来源于stack exchange,提问作者baddie
相关产品推荐
相关产品推荐

