我们有一个Silverlight应用程序,它使用WCF RIA服务和实体框架4.1连接到数据库。
目前,连接字符串是作为web.config中的标准提供的,这一切都能成功运行。
但是,我现在希望能够在运行时基于用户登录等动态更改连接字符串。
我发现了一些暗示这样做的其他posts,但他们使用的是ObjectContext,而我们在System.Data.Entity命名空间和DbDomainService类中使用DbContext。
为了弥补这一点,我在DbDomainService实现中覆盖了CreateDbContext()方法,如下所示:
protected override CoreContext CreateDbContext()
{
dbServer = null, dbName = null;
httpCookie = System.Web.HttpContext.Current.Request.Cookies["DBServer"];
if (httpCookie != null)
{
dbServer = httpCookie.Value;
}
var cookie = System.Web.HttpContext.Current.Request.Cookies["DBName"];
if (cookie != null)
{
dbName = cookie.Value;
}
if (dbServer == null && dbName == null)
{
return new CoreContext();
}
string connStr = "Data Source=" + dbServer + ";Initial Catalog=" + dbName + ";Integrated Security=true";
return new CoreContext(connStr);
}
这在第一次加载Silverlight应用程序时成功运行,但是,在所有后续加载中,尽管将要替换的值更改为连接字符串,仍会使用与最初建立的连接相同的连接。
获取连接的唯一方法似乎是在IIS中回收应用程序池并再次加载应用程序。
我做错了吗?或者是否不可能让DbDomainService动态更改它的连接?
答案 0 :(得分:0)
我正在考虑域服务类的实例化模型。您是否尝试过自定义IDomainServiceFctory?它允许您决定何时创建它们的新实例,并且实现起来非常简单 另请参阅FredrikNormén的this post。