【问题标题】:Using a dynamic connection string with the Breeze EFContextProvider将动态连接字符串与 Breeze EFContextProvider 一起使用
【发布时间】:2012-11-29 00:24:30
【问题描述】:

目前我有一个应用程序(web/silverlight),其中我的 ObjectContext 的连接字符串是动态的。它基于用户的登录方式,因为我的每个客户都有自己的数据库。即..用户名@域。我正在尝试找到一种使用 EFContextProvider 的方法,即通过构造函数传递 ObjectContext,或覆盖 GetConnectionString,遗憾的是两者都不支持。

有没有办法做到这一点,或者我可以在某处下载 EFContextProvider 的源代码以便我自己实现它?

提前致谢。

这个问题由 Marcel 在我们的 IdeaBlade 论坛上发布。我在这里重新发布问题和答案,因为我认为它对 Breeze Stack Overflow 社区有用。

【问题讨论】:

    标签: entity-framework breeze


    【解决方案1】:

    您不应该为了这么简单的事情下载源代码并对其进行修改。 现在您不必这样做了

    我们已将EFContextProvider 的简单更新推送到 GitHub。此更改将出现在下一个 Breeze Runtime 版本 (> 0.81.2) 中。

    EFContextProvider 用于创建“T”(您的 ObjectContext/DbContext)的位置如下:

    _context = 新 T();

    它现在调用一个虚拟方法,T CreateContext(),它的默认实现是:

    受保护的虚拟 T CreateContext() { 返回新的 T(); }

    在您的 EFContextProvider 子类中覆盖并替换它,您将能够按照您喜欢的方式创建类型为“T”的上下文。

    注意:基础EFContextProvider 仍会进行一些创建后配置,以确保其行为符合我们的预期;我们不希望上下文进行任何延迟加载或创建代理。

    所以如果 'T' 是 ObjectContext,提供者会这样做:

    objCtx.ContextOptions.LazyLoadingEnabled = false;

    如果'T'是DbContext,它会这样做:

    dbCtx.Configuration.ProxyCreationEnabled = 假; dbCtx.Configuration.LazyLoadingEnabled = 假;

    【讨论】:

    • 如何使用它来更改每次调用的数据库连接字符串?示例:2 个具有不同连接字符串但型号完全相同的公司数据库。控制器获取一个参数,根据该参数可以提供正确的连接字符串...
    【解决方案2】:

    我下载了源代码并添加了一个构造函数到 EFContextProvider 接受 T 的实例以便能够使用 现有的 ObjectContext/DbContext 就像一个魅力。

    Marcel 自己想通了,并在我们的论坛上回答了他自己的问题。

    【讨论】:

    • 这是最好的解决方案吗?我不想下载源代码并进行更改以阻止我更新到 Breeze 的更新版本。我确实需要基于连接字符串名称的上下文,或者更好的是我创建的 dbcontext。
    • 不,这不是一个好的解决方案。应该可以提供您自己的上下文工厂。我会把它放在清单上。
    【解决方案3】:

    Ward 提到的 CreateContext 虚拟方法现在在 v 0.83.2 中可用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 2020-10-05
      • 2018-03-05
      相关资源
      最近更新 更多