实体框架代码优先 - 预加载未按预期工作?

2023-11-23

我有以下实体框架 POCO 类:

public class Customer
{
    public int Id {get;set;}
    public string Name {get;set;}

    public virtual ICollection<Order> Orders {get;set;}
}

public class Order
{
    public int Id {get;set;} 
    public int CustomerId {get;set;}
    public int OrderTypeId {get;set;}

    public virtual OrderType Type {get;set;}
    public virtual Customer Customer {get;set;}
} 

public class OrderType 
{
    public int Id {get;set;}
    public virtual ICollection<Order> Orders {get;set;}
}

问题是当我归还我的ICollection<Order>我得到了Order没关系,但是OrderType的财产Order没有被填充。我的订单将包含以下详细信息:

Id:          1
CustomerId:  1
Customer:    Populated
OrderTypeId: 3
Type:        null        // Never returned

我的映射代码如下所示:

public void ConfigureOrder(ModelBuilder builder)
{
    // Mapping from Order -> Customer
    builder.Entity<Order>()
        .HasRequired(x => x.Customer)
            .WithMany(x => x.Orders)
                .HasConstraint((order, cust) => order.CustomerId == cust.Id);

    // Mapping from Order -> OrderType
    builder.Entity<Order>()
        .HasRequired(x => x.OrderType)
            .WithMany(x => x.Orders)
                .HasConstraint((order, type) => order.OrderTypeId == type.Id);
}

然后我在我的上下文中禁用了延迟加载:

public Context(string connectionString)
    : base(connectionString)
{
    ObjectContext.ContextOptions.LazyLoadingEnabled = false;
}

因此,为了返回我的存储库中的数据,我使用Include的方法System.Data.Entity:

var query = from item in context.Customers
                .Include(x=> x.Orders)
            where item.Id == customerId
            select item;

我假设是因为我无法指定Orders.OrderType,这就是问题所在,所以我尝试了一些变体:

1 -> .Include(x=> x.Orders.FirstOrDefault().OrderType)
2 -> .Include("Orders")
3 -> .Include("Orders")
     .Include("Orders.OrderType")

但我永远无法返回 OrderType 属性,除非我直接加载 Order:

var query = from item in context.Orders
                .Include(x=> x.OrderType)
            select item;

此代码将正确返回订单中的 OrderType。


哦亲爱的。看来我真是一头驴了。现在已经17点45分了,反正我也该回家了。

我有两个 Get 方法:

Get(int customerId)
{
    // This was the method I was testing within
    var query = from item in context.Customers
                    .Include("Orders.OrderType")
                select item;
}

Get(int customerId, int versionId)
{
    // This was the method that was running
    var query = from item in context.Customers
                    .Include(item.Orders)
                select item;
}

So, "Orders.OrderType"是正确的,尽管看起来很糟糕的解决方案。我需要一些咖啡因。

EDIT:

回到这个问题,包含的最佳方法是使用System.Data.Entity的包含方法:

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

实体框架代码优先 - 预加载未按预期工作? 的相关文章

随机推荐

  • 阻止通过 http 直接访问文件,但允许 php 脚本访问

    我正在将文件 pdf doc flv 等 加载到缓冲区中 并通过脚本将它们提供给我的用户 我需要我的脚本能够访问该文件 但不允许直接访问它 实现这一目标的最佳方法是什么 我应该使用我的权限执行某些操作还是使用 htaccess 锁定目录 最
  • 是否可以对SVN中存储的内容进行加密?

    如果我将源代码存储在共享托管公司的 SVN 中 是否可以对内容进行加密 这样即使有人有权访问该存储库 他们也无法在普通视图中看到源代码 有这个插件吗 否则我想自己实现这个会很疯狂 这里的正确答案是 找到您信任的托管提供商 如果存在监管问题
  • Xcode - 如何制作弹出菜单[重复]

    这个问题在这里已经有答案了 我想在 Xcode 中制作一个弹出菜单 我该怎么做 我希望它看起来漂亮又专业 以下是使用 UIActionSheet 在 UITextView 中显示弹出菜单以响应长按附件的示例 void attachmentA
  • tmPlot 在命名空间中,但未找到其依赖项

    我有一个使用的包tmPlot函数来自treemap 但是当我尝试使用该函数时 它会抛出一个错误 表明其依赖项之一未加载 Error in tmPlot data index index vSize vSize could not find
  • 将文件复制到网络共享驱动器上

    我有一个网络共享驱动器 serveur folder 我想在其中复制文件 我可以使用特定用户 用户 通行证 在驱动器上写入内容 如何使用 C 访问具有写入权限的共享驱动器 未经测试的代码 但它将类似于 AppDomain CurrentDo
  • 显式复制构造函数或按值隐式参数

    我最近读到 不幸的是忘记了在哪里 编写operator 的最佳方式是这样的 foo operator foo other swap this other return this 而不是这个 foo operator const foo ot
  • 如何在不创建android项目的情况下设置libgdx的assets文件夹?

    有办法做吗 我在谷歌上找不到任何相关的教程 Libgdx 不会强制执行任何特定的层次结构或文件夹命名约定来保存您的资产 以便Gdx files internal myassets libgdx png 在桌面上运行得很好 但是 Androi
  • 如何使用 clang++/libc++ 编译/链接 Boost?

    这个问题的答案为什么不能在 c 0x 模式下用 libc 来 clang 链接这个 boost program options 示例 指出 您需要使用 clang stdlib libc 重建 boost 我正在使用 MacOS Lion
  • 如何在 SwiftUI 中将呈现视图关闭到选项卡视图的根视图?

    我在用着TabView在我的主页上 假设我有 4 个选项卡 在第二个选项卡上 我可以使用转到另一个视图NavigationLink我使用另外两个视图NavigationLink 然后在最新的视图上 有一个按钮可以呈现视图 我使用 fullS
  • 找不到方法 apt()

    我正在尝试使用 Dagger2 我正在使用 Android studio 2 2 2 但我的 gradle 出现错误 Error 34 0 Could not find method apt for arguments com google
  • Tomcat 停止响应 Apache

    我正在尝试解决有关使用 mod proxy ajp 连接 Apache 和 Tomcat 的问题 就我而言 Tomcat 停止响应 Apache 并且 apache 日志打印如下日志错误消息 Mon May 06 15 22 47 2013
  • 如何声明两个类,使得 A 具有 B 的成员并且 B 将 A 的成员标记为朋友?

    我正在尝试做 C Primer 第 5 版中的练习 7 32 该练习要求以下内容 定义您自己的版本Screen and Window mgr其中clear是的成员Window mgr和一个朋友Screen 以下是以下的定义Screen Wi
  • Visual Studio 2015 没有语法突出显示剃刀或 Intellisense

    我在 VS2015 RC 中的 Razor 视图没有显示 C 代码的正确颜色 我的项目在 VS2013 中运行良好 但在 2015 年则不然 并且它没有为我提供有关 C 代码的任何智能感知 解决方案已构建并且站点运行良好 我尝试了以下方法但
  • 将数组列表从一个活动传递到另一个活动

    我怎样才能通过ArrayList从一项活动转到另一项活动 这取决于数组列表的类型 putIntegerArrayListExtra String name ArrayList
  • @Immediate 注解在 Jersey2 中的使用

    我有一个与这里提出的问题类似的问题 如何让我的 Jersey 2 端点在启动时立即初始化 但稍微往下走一点 我可以立即加载我的资源 但是当我尝试通过调用 REST url 来使用它时 我得到以下堆栈跟踪 java lang IllegalS
  • Nextjs动态路由渲染两次

    我有一条动态路线pages user id jsx my id jsx包含console log useRouter query id 如果我去url user 5当我检查控制台时 一旦我得到未定义的值 然后得到正确的 ID 在本例中为 5
  • 多Mapper创建对象层次结构

    我已经玩了一段时间了 因为它看起来很像记录的帖子 用户示例 但它略有不同 对我不起作用 假设以下简化设置 一个联系人有多个电话号码 public class Contact public int ContactID get set publ
  • 为什么android模拟器相机会意外停止?

    我使用的是 Android 2 2 API 级别 8 相机已在清单中启用 当我尝试模拟器模型提供的相机图标时 它运行了几秒钟 显示一个灰色框在黑白棋盘周围移动 然后终止并显示错误消息 对不起 应用程序相机 进程 com android ca
  • 无法保存图像干预图像。 Image.php 第 138 行中的 NotWritableException

    我正在尝试保存经过处理的图像 并将其推送到 s3 我的代码有效此代码将图像直接保存在公共文件夹中 public function store Filesystem filesystem request Input all validator
  • 实体框架代码优先 - 预加载未按预期工作?

    我有以下实体框架 POCO 类 public class Customer public int Id get set public string Name get set public virtual ICollection