C# 实体框架应在插入时立即包含属性

C# 实体框架应在插入时立即包含属性,c#,entity-framework,C#,Entity Framework,我有一些代码看起来有点像这样: var query = from row in context.Orders.Include("Customer") where row.Id = 5 select row; var result = query.FirstOrDefault(); if(result == null) { result = new Order {CustomerId=5,...} context.Orders.Add(result); contex

我有一些代码看起来有点像这样:

var query = from row in context.Orders.Include("Customer") 
where row.Id = 5 
select row;

var result = query.FirstOrDefault();

if(result == null)
{
    result = new Order {CustomerId=5,...}
    context.Orders.Add(result);
    context.SaveChanges();

    // at this point result.Customer is null
    // and is not lazy-loaded by EF on access
}

return result;
正如您在上面的代码中所看到的,如果发生了插入,那么结果的Customer属性将不包括在内,这将在稍后的代码中给我一个错误


插入
result
时,如何确保从数据库加载
result.Customer
?我可以不用手动选择它吗?

EF无法在不选择它的情况下创建Customer对象。这里只有一个Id。需要转到数据库并找到Id为5的customer对象

EF不能在这里延迟加载它,因为您的
结果
实际上是一个POCO
订单
,而不是EF生成的知道如何延迟加载的代理

最简单的方法可能是查询客户并按值而不是(或同时)按id设置关系:-

或者,您可以使用
context.Orders.Create()
,以便首先使用EF代理:-

if(result == null)
{
  var result = context.Orders.Create();
  result.CustomerId = 5;
  ...
}
不过,请注意,根据域中预期的行为,像这样混合查询和命令通常不是一个好主意。你可能想阅读一些关于CQR的文章,例如


创建订单是一项相当重要的操作。将其插入到一个查询中,以查询一个尚不存在的订单,将来可能会再次出现,并对您造成影响。

“正如您在上面的代码中所看到的那样……结果的客户属性不包括在内”我们怎么能看到这一点?你的密码到底有什么问题?“稍后在代码中”会看到哪些错误消息?目前很难理解您的要求。@Iain Galloway感谢您的编辑。您的查询在我看来很奇怪,因为您正在检索ID=5的
订单
,如果找不到,您将为ID=5的
客户创建一个新订单。您确定查询不应该来自context.Customers.Include(“订单”),其中cust.ID=5选择cust
?当然,我的示例也简化为只询问基本信息,因此这个答案非常适合我的代码。我将尝试实现它,然后我的“客户”查询将完成我需要的所有包含操作。真正的代码可能有10个包含给客户,而我真正的场景与订单等无关,只是简单地制作,因为大多数都可以很容易地关联到这一点。
if(result == null)
{
  var result = context.Orders.Create();
  result.CustomerId = 5;
  ...
}