Entity framework 我应该如何配置Blazor的实体框架生命周期?

Entity framework 我应该如何配置Blazor的实体框架生命周期?,entity-framework,entity-framework-core,blazor,blazor-server-side,lifecycle,Entity Framework,Entity Framework Core,Blazor,Blazor Server Side,Lifecycle,我正在开发一个blazor应用程序,它广泛使用实体框架。我读过一些文章,认为DbContext的默认生命周期不适合Blazor(请参阅)。但是,我不打算将上下文直接注入到组件中,而是使用将上下文注入其中的服务。只要上下文在我的主要表单组件的生命周期中存在,就不应该有任何问题 我应该将上下文和服务都配置为瞬态吗?我的理解是,每当组件接收到上下文时,这将提供这两者的新实例 我的服务是否需要实现IDisposable才能正确处置?或者,如果它的唯一依赖项是DbContext,那么这不是必需的吗 简

我正在开发一个blazor应用程序,它广泛使用实体框架。我读过一些文章,认为
DbContext
的默认生命周期不适合Blazor(请参阅)。但是,我不打算将上下文直接注入到组件中,而是使用将上下文注入其中的服务。只要上下文在我的主要表单组件的生命周期中存在,就不应该有任何问题

  • 我应该将上下文和服务都配置为瞬态吗?我的理解是,每当组件接收到上下文时,这将提供这两者的新实例
  • 我的服务是否需要实现
    IDisposable
    才能正确处置?或者,如果它的唯一依赖项是
    DbContext
    ,那么这不是必需的吗

简而言之,我想正确地实现“工作单元”的概念,这是为
DbContext
设计的。

当您使用Blazor WebAssembly时,这会在服务器上自行解决:每个API调用都有一个完全可用的生存期作为作用域

对于Blazor服务器端,使用DI管理DbContexct非常简单

推荐的方法是为每个操作创建DbContext,并使用(…){…}块使用
对其进行管理。您可以插入DbContextFactory来帮助配置

每个组件使用一个DbContext是很诱人的,但这会导致上下文长时间保持打开状态,并增加服务器上的内存使用。这不会很好地扩展,也不鼓励使用服务


因此,我会为每个服务方法使用一个DbContext。

谢谢!这是有道理的,但它也会给断开连接的实体带来问题。例如,我有一个Employee对象,它是我的主模型的子对象。目前,DbContext的共享实例允许对此进行跟踪。当我使用DbContextFactory时,这些实体不再附加到上下文,它会尝试插入它们。虽然我总是可以将它们的状态设置为“分离”,但这并没有那么干净。或者,我可以考虑组件的生存期,并确保DbContext被适当地处理。但是你的UI就是你的DAL。您将在可维护性和可测试性方面付出代价。分离的实体(数据层之外)比imho干净得多。