目前我有一个应用程序(web / silverlight),其中我的ObjectContext的连接字符串是动态的。它基于用户登录的方式,因为我的每个客户都有自己的数据库。 ie .. username @ domain。我正在尝试找到一种方法来使用EFContextProvider,它可以通过构造函数传递ObjectContext,也可以重写GetConnectionString,但遗憾的是两者都不受支持。
有没有办法实现这一目标,或者我可以在某处下载EFContextProvider的源代码,以便我自己实现它?
提前致谢。
Marcel在我们的IdeaBlade论坛上发布了这个问题。我在这里重新提出问题和答案,因为我认为它对Breeze Stack Overflow社区有用。
答案 0 :(得分:6)
您不必为了这么简单的事情而下载源代码并对其进行修改。 现在你不必。
我们向GitHub推送了EFContextProvider
的简单更新。此更改将显示在下一个Breeze Runtime版本中(> 0.81.2)。
其中EFContextProvider
用于创建'T'(您的ObjectContext / DbContext),如下所示:
_context = new T();
它现在调用虚拟方法T CreateContext()
,而其默认实现是:
protected virtual T CreateContext() { return new T(); }
覆盖并替换EFContextProvider
子类中的内容,您就可以按照自己喜欢的方式创建“T”类型的上下文。
N.B。:基础EFContextProvider
仍会进行一些创作后配置,以确保其行为符合我们的预期;我们不希望上下文进行任何延迟加载或创建代理。
因此,如果'T'是ObjectContext
,提供者将执行此操作:
objCtx.ContextOptions.LazyLoadingEnabled = false;
如果'T'是DbContext
,它会执行此操作:
dbCtx.Configuration.ProxyCreationEnabled = false; dbCtx.Configuration.LazyLoadingEnabled = false;
答案 1 :(得分:1)
我下载了源代码并添加了一个构造函数 接受T实例的EFContextProvider能够使用 现有的ObjectContext / DbContext就像魅力一样。
马塞尔自己想出来并在我们的论坛上回答了他自己的问题。
答案 2 :(得分:1)
Ward提到的CreateContext虚拟方法现在可以在v 0.83.2
中找到