Entity Framework 等待完全对象加载后再回复

Entity Framework wait for full object load before reply

我正在尝试使用 EntityFramework 数据库中的序列化对象回复 http 请求。 为此,我执行以下操作:

message m = dbContext.messages.FirstOrDefault(e => e.idmessage == id);
return Request.CreateResponse(HttpStatusCode.OK, m);

但是 message 模型有一个这样的属性:

public virtual fichero fichero { get; set; }

如果我将延迟加载设置为 false,则 fichero 属性 returned 为 null,一切正常美好的。如果延迟加载设置为 true 我会得到这样的异常 Lazy load true exception:

我想这可能是因为我尝试 return 序列化对象,然后才从数据库中完全加载它,但我对此一无所知,所以我不确定。

如何才能等到它完全加载后才能return?是否有任何类型的 subscribe 或类似的?谢谢

wait till it is fully loaded

延迟加载并不意味着导航属性(例如您的 fichero fichero)在后台加载。这意味着它们在 被请求 属性 时加载 ,例如,当您编写如下代码时:

var message = dbContext.Messages.FirstOrDefault(some query); // one database hit
var fichero = message.Fichero; // another database hit

一旦您访问 message.Fichero getter,动态生成的代理 class 将执行另一个数据库查询以检索 Fichero.

it may be because I try to return the serialized object

没错。 MVC(或 Web API,或其他)将使用反射序列化对象,并且在这样做时,它访问属性的 getters,发出另一个数据库查询 - 但 dbContext 已经被释放,所以无法用于任何进一步的查询。

可能的解决方案:

  • 从您的 API (.Include(m => m.Fichero)
  • 明确加载您想要 return 的所有内容
  • 禁用延迟加载,因此只有您的 "root" 实体会被 returned
  • 将您的实体映射到 viewmodel/DTO,无论如何这是推荐的方法

后者看起来像这样:

public class MessageViewModel
{
    public string Message { get; set; }
    public string FicheroFoo { get; set; }

    // ...
}

var message = dbContext.Messages.FirstOrDefault(some query);

var model = new MessageViewModel
{
    Message = message.Message,
    FicheroFoo = message.Fichero.Foo,
    // ...
};

return Request.CreateResponse(HttpStatusCode.OK, model);