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);
我正在尝试使用 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);