查询父实体时导航属性为空

2024-05-02

下面是我的域实体的基类:

public interface IBaseEntity
{
     public int Id { get; set; }
     
     public DateTime CreatedDate { get; set; }
     
     public DateTime UpdatedDate { get; set; }
}


public class BaseEntity : IBaseEntity
{
     public int Id { get; set; }
     
     public DateTime CreatedDate { get; set; }
     
     public DateTime UpdatedDate { get; set; }
}

public class ExternalSystem : BaseEntity
{
   public string Name { get; set; } 
   public string ConnectionUrl { get; set; } 
   public ICollection<ExternalSystemRules> ExternalSystemRules { get; set; } 
}

public ExternalSystemRules : BaseEntity
{
     public string RuleName { get; set; } 
     
     public string ConfiguredBy { get; set; } 
     
     public int ExternalSystemId { get; set; } 
     
     public ExternalSystem ExternalSystem { get; set; } 
     
     public ICollection<TaskSchedular> TaskSchedulars { get; set; } 
}

public class ExternalSystemConfiguration : IEntityTypeConfiguration<ExternalSystem>
{
    public void Configure(EntityTypeBuilder<ExternalSystem> builder)
    {
        builder.ToTable("ExternalSystem");
        builder.Property(e=>e.Id).HasColumnName("ExternalSystemId");
        builder.HasKey(e=>e.Id);
    }
}


public class ExternalSystemRulesConfiguration : IEntityTypeConfiguration<ExternalSystemRules>
{
    public void Configure(EntityTypeBuilder<ExternalSystemRules> builder)
    {
        builder.ToTable("ExternalSystemRules");
        builder.Property(e=>e.Id).HasColumnName("ExternalSystemRuleId");
        builder.HasKey(e=>e.Id);
        builder.HasOne(d=>d.ExternalSystem)
               .WithMany(p=>p.ExternalSystemRules)
               .HasForeignKey(p=>p.ExternalSystemId)
               .HasConstraintName("FK_ExternalSystemRules_ExternalSystemId");
               
        builder.Navigation(p=>p.ExternalSystem)
                .IsRequired()
                .AutoInclude();
    }
}


public class MyDatabaseContext : DbContext
{
   private readonly IConfiguration _configuration;
   public MyDatabaseContext(IConfiguration configuration)
   {
        _configuration = configuration;
         Database.EnsureCreated(); 
   }
   public DbSet<ExternalSystem> ExternalSystem {get; set; }
   public DbSet<ExternalSystemRules> ExternalSystemRule {get; set; }
   public void Save()
   {
        this.SaveChanges();
   }
}

我已经创建了现有数据库,因此我根据现有数据库表和关系创建了所有这些域模型和配置。

现在当我试图获取列表时ExternalSystems像下面这样:

var myDatabaseContext = new MyDatabaseContext();
var externalSystems = myDatabaseContext.ExternalSystem.ToList();

这将返回列表ExternalSystems但我的“ExternalSystemRules" 导航属性为 null。所有其他相关子实体均为null以及。

现在,我不想明确地继续使用.Include()加载相关实体。我想在查询父实体时使用实体框架核心的默认功能,即立即加载其他相关实体。

这里可能有什么问题?

数据库表:

ExternalSystem:
ExternalSystemId(PK)  Name   ConnectionUrl 

ExternalSystemRules:
ExternalSystemRuleId(PK)   RuleName   ConfiguredBy    ExternalSystemId(F.K)

这不是您的配置问题,而是您查询数据的方式的问题。您应该手动包含您正在寻找的关系记录/导航属性:

var externalSystems = myDatabaseContext
        .ExternalSystem
        .Include(es => es.ExternalSystemRules)
        .ToList();

不过,我建议不要使用自动包含(*)。虽然这似乎没有什么区别,但当您有数十或数百个对象需要查询时,一旦数据集增长,性能就会迅速下降。每次你查询一个集合时AutoInclude启用后,无论您是否需要,您都将获得其所有导航属性。此外,这也适用于从该实体派生的所有实体类型。如果您决定无论如何使用它,您可以通过使用禁用它来进行单个查询.IgnoreAutoIncludes().

两种方法共有的问题(Include(), 也AutoInclude()) 是层次结构。它们适用于非常简单的模型,但是一旦您尝试映射层次结构 - 想象一下类似树的东西,其中规则可以具有相同类型的子规则,您可能会遇到自引用循环的问题,并且需要手动投影。

这里有一篇很好的文章解释了这个问题:https://khalidabuhakmeh.com/ef-core-and-aspnet-core-cycle-issue-and-solution https://khalidabuhakmeh.com/ef-core-and-aspnet-core-cycle-issue-and-solution

查询数据的更好方法是使用“视图模型”,以避免将未使用或敏感的数据返回给客户。

public class ExternalSytemVm
{
    public int Id {get; set;}
    public IEnumerable<ExternalSystemRulesVm> Rules {get; set;}
    /* ...*/
}

public class ExternalSytemRulesVm
{
    public int Id {get; set;}
    public string Name {get; set;}
    /* ...*/
}

var externalSystems = myDatabaseContext
            .ExternalSystem
            .Select(es => new ExternalSystemVm {
                Id = es.Id
                Rules = es.ExternalSystemRules.Select(esr => {
                    /* ... */
                })
             })
            .ToList();

(*)如果您绝对确定您始终需要所有属性,以及应用程序中每个查询中的所有导航属性,那么这可能没问题。

文档:https://learn.microsoft.com/en-us/ef/core/querying/lated-data/eager https://learn.microsoft.com/en-us/ef/core/querying/related-data/eager

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查询父实体时导航属性为空 的相关文章

  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 根据 iOS 6 通讯录使用文档,第 22 条规则

    根据 iOS6 的文档 应使用 ABAddressBookCreateWithOptions 创建地址簿 它还表示如果调用者无权访问数据库 则此方法将返回 null 但是 访问是通过调用 ABAddressBookRequestAccess
  • 通用搜索 - 重定向到自定义屏幕

    我创建了一个自定义屏幕 它是客户屏幕的副本 问题是 当我们在通用搜索中输入客户 ID 时 如何重定向到自定义屏幕而不是客户屏幕 请查看我们自定义屏幕的图形代码 public class CustomScreen BusinessAccoun
  • Unity3D 不安全代码需要指定“unsafe”命令行选项

    我在用Unity3D 4 3并打电话给DLL我创造的 当尝试调用它唯一的函数时 这是 void GetModelReferences int nVertices float vertices int nTriangles int trian
  • 在 CentOS 6.4 上的 apache 2.0 虚拟主机中创建子域

    我需要在网络服务器上创建子域阿帕奇2 0 CentOS 6 4 PageSpeed Apc 我没有 DNS 服务器 我需要使用虚拟主机 我的代码 NameVirtualHost xx xx xx xx
  • 确定已编译Lua的编译器版本

    我有一些已编译的 LuaQ 我需要确定用于编译它的确切版本 有什么可能的方法吗 编译的脚本在文件开头有一个标头 4 bytes signature x1bLua 1 byte version 0x51 1 byte format 1 byt
  • 如何在 Java 中将 hashmap 转换为 JSON 对象 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在 Java 中将 hashmap 转换或转换为 JSON 对象 然后再次将 JSON 对象转换为 JSON 字符串 您可以使用 new
  • 不分配内存的重复排列

    我正在寻找一种算法来生成列表中重复 4 个元素 长度 2 1000 的所有排列 Java实现 http en literateprograms org Permutations with repetition 28Java 29 问题是上面
  • 将数组传递给 include() javascript

    我试图找出一个字符串是否包含存储在数组中的多个字符串 includes 所以我尝试过 let string hello james console log string includes hello james 但它被返回为false 当我
  • javascript RegExp 的奇怪行为:相同的正则表达式产生不同的结果[重复]

    这个问题在这里已经有答案了 可能的重复 为什么 Javascript 中带有全局标志的 RegExp 会给出错误的结果 https stackoverflow com questions 1520800 why regexp with gl
  • 通过 jclouds 使用 AWS (S3) - 如何承担角色

    使用普通身份验证凭据时 我可以执行以下操作 ContextBuilder newBuilder aws s3 credentials keyId key buildView BlobStoreContext class 访问 S3 的 Bl
  • 如何将 git 存储库转换为 Mercurial?

    我一直在使用 git 作为源代码存储库开发 java 应用程序 我想与其他 java 开发人员分享该项目 hg 似乎是他们最常用的 我的问题是如何将 git 存储库转换为 hg 如果我尝试谷歌搜索 将 git 转换为 hg 并且每次搜索命中
  • 以编程方式将图像添加到RelativeLayout

    我想通过代码添加各种相对布局到线性布局 每个相对布局由以下部分组成 左侧的图像视图 右侧旁边的文本视图 正好在中间 以及右侧的另一个图像 我必须使用从数据库读取的数据来添加它们 它必须使用relativelayout 因为我想在图像上使用一
  • 如何在 C++ 中将方法结果作为参数传递给基类构造函数?

    我试图实现这样的目标 class Base public Base string S class Derived Base public int foo string bar return stringof foo actually som
  • 按属性值对结构体数组进行排序

    我在 C 中有一个任务 使用 qsort 对结构进行排序 struct user enum SEX m f sex char name 32 char phonenr 32 typedef struct user User 用户将存储在一个
  • Haskell Servant 和流媒体

    我正在尝试添加一个功能到我的servant服务器将从 Amazon S3 获取文件并将其流式传输回用户 由于文件可能很大 我不想将它们下载到本地然后将它们提供给客户端 我宁愿将它们直接从 S3 流式传输到客户端 I use Amazonka
  • 如何在 Python 中重命名文件并保留创建日期

    我知道创建日期不存储在文件系统本身中 但是当我使用时我遇到了问题os rename 它正在更新我正在使用的文件的创建日期 是否可以重命名文件而不更改其原始创建日期 正如都铎所说 你可以使用os stat http docs python o
  • 使用 TextFlow 在 TableView 中突出显示文本

    我读到 从 JavaFX 8 开始 您可以使用 TextFlow 来突出显示文本 但我不知道如何将它用于我的 TableView 在我的控制器类中 我有这个 TableView
  • 代表和活动之间有什么区别?

    代表和活动之间有什么区别 两者不都包含对可以执行的函数的引用吗 An Event声明增加了一层抽象和保护delegate实例 此保护可防止委托的客户端重置委托及其调用列表 并且仅允许在调用列表中添加或删除目标
  • 在 ant 脚本中使用最新的 Rhino

    我试图在 ant 标签中使用最新版本的 Rhino 但它似乎使用与 JVM 捆绑在一起的 Rhino 版本 我尝试调整类路径以指定 Rhino 脚本 jar 目前 我已尝试以下操作
  • 查询父实体时导航属性为空

    下面是我的域实体的基类 public interface IBaseEntity public int Id get set public DateTime CreatedDate get set public DateTime Updat