共有データベース ソリューションを使用していますが、1 つのデータベースにしかアクセスできません。MVC アプリケーションがすべてのデータに対してこの 1 つのデータベースのみを使用するようにするにはどうすればよいですか? これは可能ですか?
4 に答える
MVC を実行するためにデータベースは必要ありません。データベースにアクセスするすべてのコードを記述できるため、アクセスするデータベースの数を完全に制御できます。
ここで推測していますが、データ アクセスに Entity Framework を使用していて、Membership プロバイダーも利用したいのですが、Entity Framework テーブルと同じ DB でメンバーシップ スキーマを取得するのに問題があります。その場合は、次のことを試してください。
エンティティ フレームワーク (または作成済みのその他の DB のもの) はそのままにし、 aspnet_regsql.exe を使用してメンバーシップ スキーマを作成するデータベースを指定します。
このツールは、コマンド ラインまたは適切なセットアップ ウィザードを使用して効率的にテーブルを作成します。
こちらのチュートリアルを参照してください http://www.asp.net/web-forms/tutorials/security/membership/creating-the-membership-schema-in-sql-server-vb「ステップ 2: 追加」というタイトルのセクションに特に注意してください。 Database への SqlMembershipProvider スキーマ。
便宜上、上記の記事から重要な部分を貼り付けたものを次に示します。
ステップ 2: SqlMembershipProvider スキーマをデータベースに追加する
SqlMembershipProvider では、特定のテーブル、ビュー、およびストアド プロシージャのセットをユーザー ストア データベースにインストールする必要があります。これらの必要なデータベース オブジェクトは、aspnet_regsql.exe ツールを使用して追加できます。このファイルは、%WINDIR%\Microsoft.Net\Framework\v2.0.50727\ フォルダーにあります。
注: aspnet_regsql.exe ツールは、コマンド ライン機能とグラフィカル ユーザー インターフェイスの両方を提供します。グラフィカル インターフェイスはよりユーザー フレンドリーであり、このチュートリアルで検討します。コマンド ライン インターフェイスは、ビルド スクリプトや自動テスト シナリオなど、SqlMembershipProvider スキーマの追加を自動化する必要がある場合に便利です。
aspnet_regsql.exe ツールは、ASP.NET アプリケーション サービスを指定した SQL Server データベースに追加または削除するために使用されます。ASP.NET アプリケーション サービスには、SqlMembershipProvider および SqlRoleProvider のスキーマと、他の ASP.NET 2.0 フレームワーク用の SQL ベースのプロバイダーのスキーマが含まれます。aspnet_regsql.exe ツールに次の 2 つの情報を提供する必要があります。
アプリケーション サービスを追加または削除するかどうか アプリケーション サービス スキーマを追加または削除するデータベース 使用するデータベースを求めるプロンプトで、aspnet_regsql.exe ツールは、データベースが存在するサーバーの名前を指定するように求めます。データベースに接続するためのセキュリティ認証情報とデータベース名。非 Express Edition の SQL Server を使用している場合、この情報は、ASP.NET Web ページを介してデータベースを操作するときに接続文字列を介して提供する必要がある情報と同じであるため、既に知っている必要があります。ただし、App_Data フォルダー内の SQL Server 2005 Express Edition データベースを使用する場合、サーバーとデータベースの名前を決定するのはもう少し複雑です。
「aspnet」と呼ばれる独自のデータベースを作成する Microsoft 提供のメンバーシップ、セッション、およびプロファイル プロバイダーを使用しない。
(web.config ファイルの変更が必要です)
それ以外は、StanK の言うとおりです。自分でコードを作成できるか、むしろ作成する必要があります。
ところで、それが Sql-Server データベースでない場合は、.NET フレームワークに組み込まれているものとは別の ado.net プロバイダーが必要になる場合があります。
データベースにアクセスするコードの例を次に示します。
protected System.Data.Common.DbProviderFactory m_providerFactory = null;
protected System.Data.SqlClient.SqlConnectionStringBuilder m_ConnectionString;
public System.Data.Common.DbProviderFactory GetFactory()
{
System.Data.Common.DbProviderFactory providerFactory = null;
providerFactory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient");
return providerFactory;
} // End Function GetFactory
public System.Data.IDbConnection GetConnection()
{
System.Data.SqlClient.SqlConnection sqlc = new System.Data.SqlClient.SqlConnection("ConnectionString");
return sqlc;
} // End Function GetConnection
public System.Data.IDbConnection GetConnection(string strInitialCatalog)
{
if (string.IsNullOrEmpty(strInitialCatalog))
{
return GetConnection();
}
System.Data.SqlClient.SqlConnection sqlc = null;
lock (this.m_ConnectionString)
{
string strOrigInitialCatalog = this.m_ConnectionString.InitialCatalog;
this.m_ConnectionString.InitialCatalog = strInitialCatalog;
sqlc = new System.Data.SqlClient.SqlConnection(this.m_ConnectionString.ConnectionString);
this.m_ConnectionString.InitialCatalog = strOrigInitialCatalog;
strOrigInitialCatalog = null;
}
return sqlc;
}
public override System.Data.IDbCommand CreateCommand()
{
return CreateCommand("");
} // End Function CreateCommand
public override System.Data.IDbCommand CreateCommand(string strSQL)
{
System.Data.IDbCommand idbc = this.m_providerFactory.CreateCommand();
idbc.CommandText = strSQL;
return idbc;
} // End Function CreateCommand
public System.Data.DataTable GetDataTable(System.Data.IDbCommand cmd, string strDb)
{
System.Data.DataTable dt = new System.Data.DataTable();
using (System.Data.IDbConnection idbc = GetConnection(strDb))
{
lock (idbc)
{
lock (cmd)
{
try
{
cmd.Connection = idbc;
using (System.Data.Common.DbDataAdapter daQueryTable = this.m_providerFactory.CreateDataAdapter())
{
daQueryTable.SelectCommand = (System.Data.Common.DbCommand)cmd;
daQueryTable.Fill(dt);
} // End Using daQueryTable
} // End Try
catch (System.Data.Common.DbException ex)
{
//COR.Debug.MsgBox("Exception executing ExecuteInTransaction: " + ex.Message);
Log("cMS_SQL.GetDataTable(System.Data.IDbCommand cmd)", ex, cmd.CommandText);
}// End Catch
finally
{
if (idbc != null && idbc.State != System.Data.ConnectionState.Closed)
idbc.Close();
} // End Finally
} // End lock cmd
} // End lock idbc
} // End Using idbc
return dt;
} // End Function GetDataTable
public override System.Data.DataTable GetDataTable(string strSQL, string strInitialCatalog)
{
System.Data.DataTable dt = null;
using (System.Data.IDbCommand cmd = this.CreateCommand(strSQL))
{
dt = GetDataTable(cmd, strInitialCatalog);
} // End Using cmd
return dt;
} // End Function GetDataTable
使用法:
GetDataTable("SELECT * FROM T_User", "DB_NAME");
未登録のプロバイダーのプロバイダー ファクトリを取得するコード:
public System.Data.Common.DbProviderFactory GetFactory(Type tAssemblyType)
{
return GetFactory(tAssemblyType.AssemblyQualifiedName);
}
public virtual System.Data.Common.DbProviderFactory GetFactory(string assemblyType)
{
#if TARGET_JVM // case insensitive GetType is not supported
Type type = Type.GetType (assemblyType, false);
#else
Type type = Type.GetType(assemblyType, false, true);
#endif
if (type != null && type.IsSubclassOf(typeof(System.Data.Common.DbProviderFactory)))
{
// Provider factories are singletons with Instance field having
// the sole instance
System.Reflection.FieldInfo field = type.GetField("Instance", System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Static);
if (field != null)
{
return (System.Data.Common.DbProviderFactory)field.GetValue(null);
//return field.GetValue(null) as DbProviderFactory;
}
}
throw new System.Configuration.ConfigurationErrorsException("DataProvider is missing!");
//throw new System.Configuration.ConfigurationException("DataProvider is missing!");
} // End Function GetFactory
例 (postgre ファクトリーの取得):
public System.Data.Common.DbProviderFactory GetFactory()
{
//AddFactoryClasses();
System.Data.Common.DbProviderFactory providerFactory = null;
providerFactory = this.GetFactory(typeof(Npgsql.NpgsqlFactory));
return providerFactory;
} // End Function GetFactory
初心者の質問で申し訳ありません。すべての回答に感謝します。これが私のために働いたものです。
まず、DBContext データ モデルを次のようにします...
public class CDBContext : DbContext
{
public DbSet<tbl1> tbl1{ get; set; }
public DbSet<tbl2> tbl2{ get; set; }
public DbSet<tbl3> tbl3{ get; set; }
public DbSet<tbl4> tbl4{ get; set; }
}
次に、テーブルモデルの例を次のようにします
public class tbl1
{
public int ID { get; set; }
public string Var2{ get; set; }
public string Var3{ get; set; }
}
次に、「Add->Controller」ウィザードを使用して、適切なデータ モデル (tbl1) と適切なコンテキスト (CDBContext) を選択します。次に、モデル tbl2、tbl3、および tbl4 に対してこれを実行できます。各モデルは、データベースにテーブル全体を使用するのではなく、データベース内のテーブルになります (以前はそうしていました)。
今はうまくいっているようです。ありがとうございます。