代码之家  ›  专栏  ›  技术社区  ›  Dirk Boer

如何禁用可选的依赖实体

  •  1
  • Dirk Boer  · 技术社区  · 5 年前

    我有以下两个实体使用EF Core的split table选项引用一个表——这是 非常 简化版:

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

    从 documentation :

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

    有可能禁用这种行为吗?我有多个列,其中包含许多默认为空的分组行为。

    现在默认情况下不会创建实体(设置)。这意味着我必须到处检查。我宁愿为所有属性创建空值设置。

    如果我自己在 母实体 (帐户)这些变化似乎没有被跟踪,因为我猜EF Core不知道这个类。

    有解决办法吗?

    1 回复  |  直到 5 年前
        1
  •  4
  •   Ivan Stoev    5 年前

    不幸的是,这项功能在EF Core 3中不可用。

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

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

    在EF Core 5.0中,可以将指向所属实体的导航配置为所需的依赖项

    以上只是“What's New”一节中功能的发布。事实上,它可以用于任何一对一的关系,正如官方文件中提到的 One-to-one 文件部分:

    默认情况下,从属端是可选的,但可以根据需要进行配置。但是,EF不会验证是否提供了依赖实体,因此只有当数据库映射允许强制执行时,此配置才会产生影响。一种常见的情况是引用拥有的类型,默认情况下使用表拆分

    要根据需要配置依赖项,必须使用 Navigation fluent API(也在5.0中引入)与 IsRequired :

    modelBuilder.Entity<Account>()
        .Navigation(e => e.Settings)
        .IsRequired();
    
    推荐文章