[英]EF Core 5.0 with Cosmos - New properties and backing fields
我正在使用 EF Core 5.0 和 Cosmos,我正在尝试解决如何处理可能将新属性添加到 model 的情况,但旧文档没有此新属性。 例如,如果原始 model 看起来像:
{
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?
,它有效......这是可以理解的。 但是我试图避免使用可空类型,因为我需要添加额外的代码来检查空值等。
我尝试使用“支持字段”来使其正常工作,如下所示:
{
public int Id { get; set; }
public string Title { get; set; }
private bool? _isEnabled { get; set; }
public bool IsEnabled {
get => _isEnabled ?? false;
set => _isEnabled = value;
}
}
...然后在 model 构建器中使用 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 。
文档提到,如果您选择PropertyAccessMode.Field ,如果无法读取或写入该字段,则会引发异常。
您在上面所做的应该可以正常工作。 我在某些情况下做了类似的事情,而且效果很好。 (英法 6)
EF6 甚至可以推断支持字段,因此您的绑定只需
modelBuilder.Entity<MyEntity>().Property(m => m.IsEnabled)
只有当无法推断支持字段时,您才需要手动定义支持字段(我猜这是他们在 EF6 中修复的内容)
当文档中不存在IsEnabled
字段时,为什么要使用false
值填充它?
考虑一种情况,其中文档具有实际IsEnabled = false
的字段和人为具有IsEnabled = false
的文档,您将如何区分它们? 添加另一个字段?
相同的问题将适用于具有不同数据类型的其他属性。
这种方法在我看来是错误的。 而不是这个,如果你真的不想使用可为空的属性,你可以为你的模型使用版本控制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.