2016-10-25 9 views
3

独自のIdentityDbContextの実装があるので、ユーザーの選択に応じてカスタムデータベースに接続できるようにしたいと考えています。だから私は、デフォルトのデータベースとユーザーが選択したデータベースの両方に対して2つのコンストラクタを作成しました。可変接続文字列を使用してIdentityDbContextを作成する方法は?

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("Users", throwIfV1Schema: false) 
    { 
     //Aici am adaugat 
     Configuration.ProxyCreationEnabled = true; 
     Configuration.LazyLoadingEnabled = true; 
    } 

    public ApplicationDbContext(String connectionName) 
     : base(connectionName, throwIfV1Schema: false) 
    { 
     //Aici am adaugat 
     Configuration.ProxyCreationEnabled = true; 
     Configuration.LazyLoadingEnabled = true; 
    } 
} 

私の問題は、カスタムconnectionNameをクラスに持ち込む方法です。

コンストラクタは、この方法で呼び出されます。この文脈でHttpContext.Currentがnullであるため、セッション変数を使用して

public static string conn; 
public static ApplicationDbContext Create() 
     { 
      if(conn == null) 
       return new ApplicationDbContext(); 
      else 
       return new ApplicationDbContext(conn); 
     } 

は不可能です。 Createメソッドに文字列引数をStartupクラスの権利は、すべてのユーザーの選択の前に、Owinは、デフォルトのデータベースを使用することに決定したので、また不可能です追加:

app.CreatePerOwinContext(() => ApplicationDbContext.Create()); 

それはwouldnので、そこに助けないだろうでも引数を渡しますユーザーによって選択されました。

は、私はそれについて何ができますか?

ありがとうございました!

+0

ユーザーが選択したことは何を意味していますか?他のユーザーがIdentityインスタンスに対して認証するサイトの管理者を意味しますか?そうでなければ、接続を選択した後に起こる認証後にユーザーが誰かを知ることができないので、どのように可能であるかはわかりません。あなたが実際にこれを行うことによって達成しようとしていたことを説明することができれば、より多くのことを助けるでしょう。 – Igor

+0

あなたは何を意味するのか正確にはわかりませんが、@Igorが持っているのと同じ質問がありますが、おそらくこれが助けになるでしょうhttp://stackoverflow.com/questions/18297052/asp-net-identity-how-to-set- target-db – Jack1987

+0

Owinの設定でRequestごとに1つのApplicationDbContextがあるため、これは機能しません。 –

答えて

0

私はクッキーを使用します。

この試してみてください:あなたは何ができるか

Startup.Auth.cs

app.CreatePerOwinContext<ApplicationDbContext>(ApplicationDbContext.Create);

ApplicationDbContext.cs

public static ApplicationDbContext Create(IdentityFactoryOptions<ApplicationDbContext> options, IOwinContext context) 
{ 
    // Do things here. 
    string choice = context.Request.Cookies...; 
    // Make sure that the cookie is correct. 
    return new ApplicationDbContext(connectionName); 
} 
+0

この場合、クッキーがうまくいかない理由を教えてください。問題は「ユーザーの選択」です。 –

+0

開始クッキーは安全ではないので、人々があなたのアプリに必要なものを注入できるようになります。 – DavidG

+0

質問は、それがユーザーの選択であり、Cookieがユーザーのものであると具体的に言います...そして、あなたは単にクッキーをフィルタリングし、クッキーの正当性を正確にチェックできます。 –

0

は使用しています静的クラスを持っています接続文字列を生成するプロバイダ。

これで、ユーザーは接続を選択して、どこにいても接続を保存できるようになります。プロバイダは接続文字列を読み取り、コンテキスト初期化子に供給します。

このようにして、すべての処理が行われる前にプロバイダを設定できます。単体テストのために欲しがっているのであれば、それを嘲笑することができます。

私は自分の携帯電話から書いています。私は、デスクトップの前にいるときにコードサンプルの回答を改善します。

アップデート(私はデスクトップの前に今の私):これを実装する

最も簡単な方法は、nameOrConnectionStringパラメータを取るコンストラクタを追加して作成します()メソッドを持っていることによって、コンテキストクラスを変更することですあなたの接続文字列を取得し、プロバイダとそのコンストラクタを呼び出す:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{   
    public ApplicationDbContext() 
     : base("aspNetIdentity", throwIfV1Schema: false) 
    { 
    } 

    public ApplicationDbContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 

    } 

    public static ApplicationDbContext Create() 
    {    
     return new ApplicationDbContext(ConnectionStringProvider.ConnectionString); 
    } 
} 

ConnectionStringProviderクラスはあなたのための接続文字列を保持している静的なクラスです:

public static class ConnectionStringProvider 
{ 
    public static string ConnectionString { get; set; }   
} 

起動時に接続文字列をデフォルトに設定し、ユーザーに変更させることができます。変更に際しては、この物件に保管してください。

あなたのご意見をお聞かせください。可能な解決策を示すための単純な回答です。クラスは静的なので、インスタンスは1つしか存在せず、接続文字列はすべての呼び出し元に配信されるため、依存関係注入やセッション/ユーザー追跡などの概念を考慮してその必要性を考慮する必要があります。

たとえば、クラスは依存関係リゾルバーによって管理される内部プロバイダーを使用できます。その後、DIコンテナにプロバイダのスコープを管理させます。

関連する問題