c# - 带有 Cosmos 的 EF Core 5.0 - 新属性和支持字段

标签 c# entity-framework-core azure-cosmosdb

我正在使用 EF Core 5.0 和 Cosmos,我正在尝试弄清楚如何处理可能将新属性添加到模型但旧文档没有此新属性的情况。例如,如果原始模型看起来像:

{
   public int Id { get; set; }
   public string Title { get; set; }
}

...然后在一段时间后添加了一个新属性...

{
   public int Id { get; set; }
   public string Title { get; set; }
   public bool IsEnabled { get; set; }
}

... 然后,当我尝试检索仅具有原始属性的文档时遇到问题(我收到“不可为空的字段必须具有值”错误)。如果我将数据类型更改为 bool?,它会起作用……这是可以理解的。但是我试图避免使用可空类型,因为我需要添加额外的代码来检查空值等。

我试过使用'Backing Fields'来让它工作,就像这样:

{
   public int Id { get; set; }
   public string Title { get; set; }
   
   private bool? _isEnabled { get; set; }
   public bool IsEnabled { 
      get => _isEnabled ?? false; 
      set => _isEnabled = value; 
   }
}

...然后在模型构建器中使用 Fluent API,如下所示:

   modelBuilder.Entity<MyEntity>()
      .Property(m => m.IsEnabled)
      .HasField("_isEnabled")
      .UsePropertyAccessMode(PropertyAccessMode.Field);

但这会为我生成以下错误:

System.InvalidOperationException:找不到属性“MyEntity.IsEnabled”的指定字段“_isEnabled”

我做错了什么?这永远不会起作用,因为属性 IsEnabled 在文档中不存在吗?

更新:问题实际上是如何使用 EF Core 和 Cosmos 处理“架构”更改的问题。我知道 NoSql 是“无模式”的,但事实是数据模型会随着时间而改变,而且由于 EF Core 迁移不适用于 Cosmos,处理这个问题的最佳方法是什么?

最佳答案

我认为,_isEnabled 字段必须是public

documentation提到,如果您选择 PropertyAccessMode.Field,如果无法读取或写入该字段,将抛出异常。

关于c# - 带有 Cosmos 的 EF Core 5.0 - 新属性和支持字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66325708/

相关文章:

c# - 无法为接口(interface)模拟传递构造函数参数(Mock IFeedResponse)

c# - 数组中的反射和递归 - StackOverflowException

c# - 使 EntityFramework 连接字符串动态化

c# - Silverlight 3 WriteableBitmap 问题

c# - Entity Framework 核心: How to IgnoreQueryFilters for DbSet Find method

asp.net-core - EFCore 中的可查询<T>.Union 行为

c# - 无法从 EF Core 1.1.2 升级到版本 2.0.0

c# - 使用 LINQ 选择 2 个列表之间的匹配结果

azure-cosmosdb - FeedOptions.EnableLowPrecisionOrderBy 属性的作用是什么

azure - 每当将 blob 添加到容器中时,将数据从 blob 存储发送到 cosmosDB 时,azure app-function 的绑定(bind)类型会出现问题