【问题标题】:How to disable optional dependent entities如何禁用可选的依赖实体
【发布时间】:2021-12-08 15:26:00
【问题描述】:

我有以下两个实体使用 EF Core 的拆分表选项引用一个表 - 这个 非常 简化版本:

class Account
    int Id
    Settings Settings
    
class Settings
    int AccountId (maps to Id)
    string PropertyX
    

来自documentation

如果依赖实体使用的所有列在 数据库,则查询时不会创建它的实例。这 允许对可选的依赖实体进行建模,其中关系 主体上的属性将为空。请注意,这也将 如果依赖项的所有属性都是可选的并设置为 null,这可能不是预期的。

是否可以禁用此行为?我有多个列,其中包含许多默认为 null 的分组行为。

现在默认情况下不会创建实体(设置)。这意味着我必须在任何地方进行空检查。我宁愿为所有属性创建使用空值的设置。

如果我自己在 父实体(帐户)的构造函数中创建实例,则似乎不会跟踪更改,因为我猜 EF Core 不知道该类。

有什么办法吗?

【问题讨论】:

标签: entity-framework-core ef-core-3.1 table-splitting


【解决方案1】:

很遗憾,此功能在 EF Core 3 中不可用。

EF Core 5.0 中添加了所谓的必需依赖 - Required 1:1 dependents:

在 EF Core 3.1 中,一对一关系的依赖端始终被认为是可选的。这在使用自有实体时最为明显,因为所有自有实体的列都在数据库中创建为可为空,即使它们在模型中已按要求进行配置。

在 EF Core 5.0 中,可以将导航到拥有的实体配置为所需的依赖

以上只是新功能部分中的功能公告。事实上,它可以用于任何一对一的关系,如官方One-to-one 文档部分所述:

依赖端默认被认为是可选的,但可以根据需要进行配置。但是,EF 不会验证是否提供了依赖实体,因此只有在数据库映射允许强制执行此配置时,此配置才会有所不同。一个常见的场景是引用拥有的类型,默认使用表拆分

要根据需要配置依赖,你必须使用Navigationfluent API(也在5.0中引入)结合IsRequired

modelBuilder.Entity<Account>()
    .Navigation(e => e.Settings)
    .IsRequired();

【讨论】:

  • 感谢 Ivan 的快速和扩展回答!
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
相关资源
最近更新 更多