EF存储库模式中一对一关系查询的位置

时间:2016-09-07 08:35:00

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

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

加载

  • ID_Load
  • 出价[]

出价

  • ID_Bid
  • ID_Load
  • 金额
  • 加载
  • 顺序

顺序

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

加载和出价:一对多 - 加载可以收到多个出价

订单和出价:一对一 - 单个出价将与订单一起映射

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

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

我目前在项目中使用Repository模式并使用 Code First

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

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

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

从订单ID中选择* ID_Load = 123

或者

从订单ID中选择* ID_Bid = 123

在这种情况下,EF / Repository Patterns中的替代方法是什么。

任何人都可以帮助我。

谢谢,

1 个答案:

答案 0 :(得分:0)

按出价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代替Single。如果查询的项目不存在,Single将抛出异常,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;