2013-12-13 224 views
1

我有一个客户订单表。订单表包含指向Customer.Id列的CustomerId字段。我检索使用以下导航对象为空;为什么?

var order = (from a in context.Order 
where a.id == OrderId select a).FirstOrDefault(); 

有具有CustomerID列也是另一个审计表中的顺序。我在审计表中创建了一个条目,并且想要从上面的查询获得的订单更新CustomerId,但是,order.customer对象为null。我究竟做错了什么?

+0

你确定在context.Order中有id = OrderId的顺序吗? – Valin

+0

检查'OrderId'的值,然后检查以确保实际上存在具有由'OrderId'指定的ID的订单。做第二部分使用数据库工具,而不是实体框架。 –

+0

你只是让EF做它的事情,或使用DataAnnotations或FluentAPI? – joelmdev

回答

3

我在猜测你的Order实体上有Customer导航属性,其中有CustomerID字段。您需要通过使用Include函数来明确加载Customer实体。

var order = (from a in context.Order.Include("Customer") 
where a.id == OrderId select a).FirstOrDefault(); 

// Check if the result is null 
if(order != null) 
{ 
    /// Do stuff... 
} 
0

这里是解决方案:

var order = (from a in context.Order 
where a.id == OrderId select a).FirstOrDefault(); 
var customer = context.Customer.Find(order.CustomerId); 
+0

这个答案会工作,但它的两次访问数据库。 – paqogomez

3

要包括你的客户数据,你会包括像下面这段代码表。

var order = (from a in context.Order 
      where a.id == OrderId select a) 
            .Include(b => b.Customer) 
            .FirstOrDefault(); 

但是,需要在订单和客户之间建立链接才能使其正常工作。

+0

+1。如果它仍然返回'null',那么你最好自己检查实体。请记住,如果没有找到,FirstOrDefault()将返回null。 – Tico

+0

实际上,Include不是您在上面的语法中放置的选项。不过,我可以在context.Order中使用Include作为@DaveB在他的回复中提出的建议。 –