如何使用实体框架查询外键对象?

2023-11-26

我正在尝试了解 Entity Framework 6,但遇到了一个问题,我已经能够在测试项目中重现该问题:

A Movie has a Nameand a Revenue. A Revenue has a GrossIncome:

public class Movie
{
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public Revenue Revenue { get; set; }
}

public class Revenue
{
        [Key]
        public int Id { get; set; }
        public double GrossIncome { get; set; }
}

我正在尝试使用 EF6 代码优先在数据库中保存有关电影的一些数据:

public class MovieContext: DbContext
{
    public MovieContext(): base("name=testDB") { }
    public DbSet<Movie> Movies { get; set; }
    public DbSet<Revenue> Revenues { get; set; }
}

我首先在数据库中插入一部新电影及其相关收入:

using (var context = new MovieContext())
{
    Revenue revenue = new Revenue()
                {
                    GrossIncome = 10
                };
    Movie movie = new Movie()
                {
                    Name = "foo",
                    Revenue = revenue
                };

    context.Movies.Add(movie);
    context.SaveChanges();
}

我可以在 SQL Server 中看到表已创建,并且Movies.Revenue_Id列已创建,具有外键关系Revenue.Id.

如果我尝试使用 SQL 查询它,它工作正常:

SELECT Movies.Name, Revenues.GrossIncome
FROM Movies
LEFT JOIN Revenues ON Movies.Revenue_Id = Revenues.Id

returns

Name    GrossIncome
----------------------
foo         10

但是,如果我尝试使用实体框架来查询数据:

using (var context = new MovieContext())
{
    List<Movie> movieList = context.Movies.ToList();
    Console.WriteLine("Movie Name: " + movieList[0].Name);

    if (movieList[0].Revenue == null)
    {
        Console.WriteLine("Revenue is null!");
    }
    else
    {
        Console.WriteLine(movieList[0].Revenue.GrossIncome);
    }

    Console.ReadLine();
}

控制台显示:

Movie Name: foo     <- It shows that the query works, and that the data in the main table is fetched.
Revenue is null!    <- Even though the data in the DB is correct, EF does not read the data from the foreign key.

我的问题很简单:我做错了什么?外键值应该如何读取?


Just include您要加载的子实体:

using (var context = new MovieContext())
{
    List<Movie> movieList = context.Movies
                                   .Include(m => m.Revenue)   // ADD THIS INCLUDE
                                   .ToList();
    Console.WriteLine("Movie Name: " + movieList[0].Name);

    if (movieList[0].Revenue == null)
    {
        Console.WriteLine("Revenue is null!");
    }
    else
    {
        Console.WriteLine(movieList[0].Revenue.GrossIncome);
    }

    Console.ReadLine();
}

这将加载电影 - 并确保所有对其各自的引用.Revenue参考文献也已加载。

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

如何使用实体框架查询外键对象? 的相关文章

随机推荐

  • 如何在 Xcode 6 调试器中查看 Swift“let”常量的值

    当我在 Xcode 6 中的调试器中停止时 如何查看使用以下命令声明的本地 Swift 常量的值let 如果我创建一个全新的 Swift 项目在 Xcode 6 中添加以下两行application didFinishLaunchingWi
  • 在 Golang 中合并地图

    我需要合并多个地图map1 id id 1 val val 1 map2 id id 2 val val 2 and map3 id id 1 val val 3 这样结果图应该合并到id values result map id id 1
  • 返回 std::pair 时会发生 RVO 吗?

    函数需要向调用者返回两个值 最好的实施方式是什么 选项1 pair
  • 如何通过 Datastax Java 驱动程序使用异步/批量写入功能

    我计划使用 Datastax Java 驱动程序写入 Cassandra 我主要感兴趣的是Batch Writes and AsycnhronousDatastax java 驱动程序的功能 但我无法获得任何教程来解释如何将这些功能合并到使
  • 避免将文本转换为链接即内容可编辑模式

    在 contenteditable div 中 在 IE 文本中 如 http blablabla www blablabla bla blabla 等自动转换为超链接http blablabla 布拉布拉布拉 bla blabla 我怎样
  • ionic 中自动增长文本区域

    我正在尝试向我的应用程序添加自动增长的文本区域 但由于某种原因它不起作用 我正在使用的模块是https github com tagged autogrow 在ionic论坛上推荐的 上面的答案并没有缩小 这是一个改进的版本 https c
  • 如何在 SQL Server Management Studio 上启用自动事务范围?

    我习惯于使用类似的工具Toad or PL Sql 开发人员对于 Oracle 我在查询窗口上运行的每个 SQL 语句都会在事务范围下自动运行 因此 如果我的 SQL 语句不正确 或者即使我错过了 SQL 脚本中的某些内容 我也只能通过单击
  • 如何通过单击模式窗口外部来关闭模式?

    在一个非常简单的 jQuery 模式中 我通过单击 CLOSE 来关闭模式 close click function e e preventDefault overlay alertModalOuter fadeOut 400 functi
  • 如何在ZF2中渲染具有布局的邮件模板?

    在 ZF1 中 我使用以下代码来呈现邮件正文 View erstellen view new Zend View Layout erstellen layout new Zend Layout HelperPath muss hier no
  • 用户输入+Ruby+正则表达式?

    我想为用户提供一个可以输入文本的文本区域 稍后我会将该输入与不同的输入进行匹配 如果匹配则将其提取 Flow 用户在文本区域中输入带回车的文本 文本保存在数据库的文本字段中 然后我使用以下内容来提取 text reply text repl
  • Python:这两个导入语句有什么区别?

    它们在功能上对我来说看起来都是一样的 使用其中一种与另一种相比有什么区别和优势吗 gt gt gt from datetime import datetime timedelta gt gt gt from datetime import
  • 从 com.apple.main-thread 入队(线程 1)崩溃 | iOS |斯威夫特 4.1

    上面发生了什么 从接收到的用户数据数组初始化领域模型 在后台线程中将所有模型一次性写入领域数据库中 如果领域模型已经存在 则通过创建副本进行更新 任何人都可以在这里指导我关于我做错了什么 我遇到了类似的问题 在这里 您可能正在从不同的线程访
  • 编译器对 PerformSelectorOnMainThread:@selector(delegateMethod) 发出警告

    我有一个包含一些 Web 服务功能的 NSOperation NSOperation 有一个委托 当操作结束时将向该委托发送消息 由于 NSOperation 位于不同的线程上 我必须像这样进行调用 delegate performSele
  • git:具有提交限制的累积差异

    git log有一些非常有用的提交限制选项 例如 no merges and first parent 我希望能够在为一系列提交生成累积差异补丁 stat numstat 时使用这些选项 使用这些命令 git log oneline fir
  • 为什么 const 限定变量被接受为 gcc 的初始值设定项?

    在最新版本的 gcc 或 clang 中编译此代码时 std c17 pedantic errors Wall Wextra static const int y 1 static int x y 然后我没有收到编译器诊断消息 即使我相当确
  • 如何用Java计算某人的年龄?

    我想在 Java 方法中以 int 形式返回以年为单位的年龄 我现在所拥有的是以下内容 其中 getBirthDate 返回一个 Date 对象 带有出生日期 public int getAge long ageInMillis new D
  • 如何等待elasticsearch重新索引?

    我有一个ElasticSearch带索引posts设置好的了 我会时不时地向其推送新文档 I want ElasticSearch仅当所有文档均已编制索引时才回复我的查询 我怎样才能做到这一点 在 ES 2 中 您可以调用refresh A
  • SQLITE:如果共享列,则将行合并为单行

    从上一篇文章中 我在 sqlite3 中有以下视图 CREATE View AttendeeTableView AS SELECT LastName FirstName as AttendeeName CompanyName PhotoUR
  • 编译器对虚函数调用的优化

    说明为什么虚拟分派在运行时发生的最流行的例子是当无法在编译时确定将创建哪个派生类时 例如 Base b rand 2 1 new Derived1 new Derived2 或者当它取决于用户输入时 假设情况并非如此 并且可以在编译时完全确
  • 如何使用实体框架查询外键对象?

    我正在尝试了解 Entity Framework 6 但遇到了一个问题 我已经能够在测试项目中重现该问题 A Movie has a Nameand a Revenue A Revenue has a GrossIncome public