使用动态连接字符串与Breeze EFContextProvider

3
目前我有一个应用程序(web/silverlight),我的ObjectContext的连接字符串是动态的,基于用户登录方式,因为我的每个客户都有自己的数据库。即..用户名@域名。我正在努力找到一种使用EFContextProvider的方法,可以通过构造函数传递ObjectContext,或者通过覆盖GetConnectionString来实现,但这两种方式都不受支持。 是否有办法实现这一点,或者我可以在哪里下载EFContextProvider的源代码,以便自己实现? 提前致谢。
3个回答

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'的上下文了。
注意:基本的EFContextProvider仍然会进行一些后期创建配置,以确保它的行为符合我们的预期;我们不希望上下文进行任何延迟加载或创建代理。
因此,如果'T'是一个ObjectContext,提供程序将执行以下操作:
objCtx.ContextOptions.LazyLoadingEnabled = false;
如果'T'是一个DbContext,它将执行以下操作:
dbCtx.Configuration.ProxyCreationEnabled = false; dbCtx.Configuration.LazyLoadingEnabled = false;

1
如何使用它来每次调用更改数据库连接字符串?例如:有两个具有不同连接字符串但完全相同模型的公司数据库。控制器获取一个参数,根据该参数可以提供正确的连接字符串... - zam6ak

1
我下载了源代码并向EFContextProvider添加了一个构造函数,该构造函数接受T的实例,以便能够使用现有的ObjectContext/DbContext,这非常有效。Marcel自己找到了答案,并在我们的论坛上回答了自己的问题。

这是最好的解决方案吗?我不想下载源代码并进行更改,以免阻止我更新到较新版本的Breeze。我确实需要上下文基于连接字符串名称,或者更好的是我创建的dbcontext。 - Wavel
不,这不是一个好的解决方案。应该可以提供自己的上下文工厂。我会把它加到列表上。 - Ward

1
“CreateContext”虚拟方法现已在v 0.83.2版本中推出,这是Ward提到的。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接