繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM