我对实体框架比较陌生,我能找到的所有文档或书籍都在讨论如何使用框架,或者应该使用哪种模型,但缺乏对框架如何深入工作的解释.
例如,当我通过LINQ查询或框架方法从数据库加载实体时,这些实体是否是线程安全的?换句话说,他们可以与其他线程共享吗?如果是这样,EF如何控制一致性?
当控件脱离上下文时,这些实体是否已经消失或仍在内存中?之后.SaveChanges那些实体消失了吗?什么是生命周期?
请EF的专家详细解释上述要点.
提前致谢.
加载实体的生命周期或多或少与加载它们的实体上下文的生命周期相关。因此,在许多例子中你会看到:
using (var ctx = new Context())
{
// ... do work
} // The context gets disposed here.
Run Code Online (Sandbox Code Playgroud)
一旦上下文被释放(例如,在语句末尾using),您不应该再将上下文中加载的实体视为可以从中加载附加信息。例如,不要尝试访问它们的导航属性。为了避免出现问题,我通常发现最好创建一个仅包含我希望人们能够使用的确切数据的 DTO,并且将其作为离开语句的唯一值using。
using (var ctx = new Context())
{
var q = from p in ctx.People
select new PersonSummary{Name = p.Name, Email = p.Email};
return q.ToList(); // This will fully evaluate the query,
// leaving you with plain PersonSummary objects.
}
Run Code Online (Sandbox Code Playgroud)
实体上下文不是线程安全的,因此您不应该尝试从绑定到同一上下文的对象的多个线程加载导航属性等,即使在上下文的生命周期内也是如此。