2010-12-03 20 views
0

私は同じサーバー上に同じデータモデルを持っています。私は、自分のユーザーが誰で、何をしているのかに基づいて、接続文字列を動的に作成したいと考えています。Silverlight Entity Framework動的接続文字列

私のユーザーは、複数のサーバー上に複数のデータベースを持つことができます。私は自分のDomainServiceを作成するときにconnectoin文字列を作成するためのきれいな方法が必要です。

DomainServiceには、希望の接続文字列を設定してから新しいエンティティを返すことができるCreateObjectContext()という名前のオーバーライド(LinqToEntitiesDomainServiceから継承)があり、人生は良いことがわかります。問題は、CreateObjectContext()がコンストラクタの後に呼び出されるため、invokeメソッドで文字列を設定できないということです。また、私はDomainService上に新しいパラメータ化されたコンストラクタを作成しようとしましたが、クライアント上のDomainContextにはコピーされません。

接続文字列を取得できた場合、CreateObjectContext()はうまくいくはずですが、クライアントからのデータを使用して接続するDBを特定する必要があるため、これは明らかに機能しません。

私がそれについて考えると、カスタムコンストラクタは私が必要とするものであると感じるほどです。それを実現する方法を理解できません。

私には何が欠けていますか?

+0

WCF Data Servicesについてはどうですか? – vorrtex

答えて

4

解決策が見つかりました。興味がある人は、ここにあります:

これはちょっとハックのような感じですが、これは私が思いつく唯一の解決策です。フォーラムSilverlight.netのSally Xuに感謝の気持ちで感謝します。

各ユーザーは複数のサーバー上に複数のデータベースを持つことができるため、初めてDomainServiceを使用する前にConnectionStringを作成する方法を見つける必要がありました。ユーザーがUIから新しいプロジェクトを選択するたびに、私はこのようなクッキーを設定します。

private void SetCookie(string cookieName, string cookieValue) 
{ 
    DateTime expireDate = DateTime.Now + TimeSpan.FromDays(1); 
    string newCookie = cookieName + "=" + cookieValue + ";expires=" + expireDate.ToString("R"); 
    HtmlPage.Document.SetProperty("cookie", newCookie); 
} 

COOKIENAMEはSelectedProjectIdあるとにcookievalueは私のUIで現在選択されたプロジェクトです。

次に、通常どおり新しいDomainServiceを作成しますが、私はCreateObjectContext()を上書きします。このメソッドは、初めてDomainServiceオブジェクトを参照するときに呼び出されます。私のオーバーライドは次のようになります。もう一度

protected override ProjectEntities CreateObjectContext() 
{ 
    long projectId = -1; 
    StringBuilder connection; 
    if (System.Web.HttpContext.Current.Request.Cookies["SelectedProjectId"] != null) 
    { 
    projectId = Convert.ToInt64(System.Web.HttpContext.Current.Request.Cookies["SelectedProjectId"].Value); 
    } 
    else throw new Exception("Selected Project ID Exception"); // temporary 

    // Verify this user has access to the DB just in case it's spoofed 

    // Lookup project ID in my database to get the database name and server name 

    // Load template connection string found in web.config 
    // Replace the template holders for SERVER_NAME and DATABASE_NAME with above lookup values 

    return new ProjectEntities(MyDynamicConnectionString);  
} 

、これは少しハックですが、それは私が動的に自分のニーズに合わせて接続文字列を作成するために見つけることができる唯一の方法でした。これが他の人に役立つことを願っています...

関連する問題