我正在使用 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/