【问题标题】:Using multiple ObjectContexts in Entity Framework 4 with the repository/uow pattern在具有存储库/uow 模式的实体框架 4 中使用多个 ObjectContext
【发布时间】:2011-06-10 16:12:07
【问题描述】:

我在 asp.net Web 应用程序中使用 EF4 和 StructureMap。我将存储库/工作单元模式用作detailed in this post。在代码中,有一行代表 global.asax 中 ObjectContext 的设置。

EntityUnitOfWorkFactory.SetObjectContext(() => new MyObjectContext());

在网页代码隐藏中,您可以像这样创建通用存储库接口...

IRepository<MyPocoObject> ds = ObjectFactory.GetInstance<IRepository<MyPocoObject>>();

我的问题是重构此代码以便我可以使用多个 ObjectContext 并在代码隐藏中区分它们的好方法是什么?基本上我的应用程序中有两个数据库/实体模型,需要在同一页面上查询它们。

【问题讨论】:

    标签: asp.net dependency-injection entity-framework-4 repository-pattern poco


    【解决方案1】:

    工作单元用于管理跨多个存储库的持久性,而不是多个对象上下文

    您将无法使用一个工作单元在多个上下文中持久保存更改,因为 UoW 只是作为 ObjectContext 的包装器实现的。因此,您需要 两个 工作单元。

    总的来说,事情会变得一团糟。您将更新两个 OC 并处理每个 HTTP 请求,更不用说事务管理将是一场噩梦。

    必须你有两个 ObjectContext 吗?这是什么原因?如果是为了可扩展性,请不要打扰;这对于您的存储库、工作单元和 http 范围管理等其他事情来说太痛苦了。

    如果不了解您是如何设置存储库的,就很难提供好的建议。

    尝试为每个对象上下文创建包装类,每个都实现 IUnitOfWork 和第二个唯一接口(IEfSqlContext1 等,代表您的模型/上下文之一)。

    然后你可以注入任何你想要的上下文。

    正如我所说,尽量避免使用两个 EDMX/上下文。麻烦多于其价值。

    【讨论】:

    • 有时最好有两个 EDMX + 上下文。我不知道为什么,但设计师不喜欢定义查询之类的某些功能,并且它会在从数据库更新期间永久删除我的更改。所以我最终得到了一个用于通用映射的 edmx 和一个用于特殊功能的 edmx。但不同的是,我的第二个对象上下文是只读的 = 不需要 UoW。
    • @Ladislav Mrnka - 有趣的方法。也许你应该添加一个答案?
    • @Ladislav:很有趣。也许你应该写下一个问题来说明你遇到的问题。一定有更好的办法。
    • 感谢您的回复 - 不幸的是,在处理遗留数据库时,我确实需要 2 个对象上下文。但是,您的回答确实有助于重新思考。原始帖子中的工作单元处理跨 httprequest 的持久性,并且在其中您可以拥有多个 objectcontext。我修改了代码,以便工作单元处理 List.
    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多