【问题标题】:Where Query In One-One RelationShip in EF Repository PatternEF 存储库模式中的一对一关系查询在哪里
【发布时间】:2016-09-07 08:34:59
【问题描述】:

以下是我的数据库架构,三个实体:

加载

  • ID_Load
  • 发件人
  • 出价[]

出价

  • ID_Bid
  • ID_Load
  • 金额
  • 加载
  • 订购

订购

  • ID_Order
  • 状态
  • 金额
  • 出价
  • 加载

加载和投标:一对多 -- 加载可以接收多个投标

订单和出价:一对一 -- 单个出价将与订单对应

订单和加载:一对一 -- 一个订单只能有一个出价

正如您在上面看到的,我在订单实体中没有 ID_Load 或 ID_Bid 属性,因为 EF 会在数据库中自动生成这些属性,因此这两个字段的属性不会添加到订单实体中

我目前在我的项目中使用带有 Code First 的 Repository 模式。

现在我想通过 ID_Load/ID_Bid 获取订单信息(因为 Bid-Order 和 Load-Order 表是一对一的关系)

我不想在应用程序中运行任何 SP 或 Select 查询,但在执行此操作时遇到问题。

如果我运行 SQL,我将不得不编写以下查询:

从 ID_Load = 123 的订单中选择 *

或者

从 ID_Bid = 123 的订单中选择 *

在这种情况下,EF/存储库模式中的替代方案是什么。

谁能帮帮我。

谢谢,

【问题讨论】:

    标签: entity-framework relationship repository-pattern one-to-one


    【解决方案1】:

    通过投标 ID 获取订单:

    long bidId; // Id of Bid
    var order = dbContext.Orders.Single(o => o.Bid.ID_Bid == bidId);
    

    通过加载 ID 获取订单:

    long loadId; // Id of Load
    var order = dbContext.Orders.Single(o => o.Load.ID_Load == loadId);
    

    如果订单的出价和加载是可选的,请使用SingleOrDefault 而不是SingleSingle如果查询的项目不存在会抛出异常,SingleOrDefault会返回null。

    或者,如果您仍然需要使用其 ID 加载投标:

    var bid = dbContext.Bids.Find(bidId);
    var order = bid.Order;
    

    这可以通过强制预先加载来优化:

    var bid = dbContext.Bids.Include(b => b.Order).SingleOrDefault(b => b.ID_Bid == bidId);
    var order = bid.Order;
    

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 2012-08-10
      • 2011-09-04
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2016-08-09
      相关资源
      最近更新 更多