Nhibernate を介してデータベースから gen ルックアップ値をコーディングする、作成しようとしている T4 テンプレートがあります。私の問題は、起動時に構成をコンパイルするために、データ アクセス レイヤーが Nhibernate 構成のパスを使用することです (静的コンストラクター)。
私のコード生成が実行されたときにこの設定ファイルを取得できるように、t4 にこのファイル パスを「認識」させる方法がわかりません。また、t4 に構成マネージャー クラスを「認識」させる方法もわかりません。これには、nhibernate xml ファイルへのパスをリストするアプリ設定が含まれています。
SQL Server 用と sqlite 用の 2 つの構成ファイルがあります。構成ファイルは、nhibernate して構成をコンパイルするために、実行中のアセンブリのルート ディレクトリにある必要があります。
私のテンプレートは、高レベルのビジネス レイヤーを使用してデータベースからデータを選択することができないようです。むしろ、すべての nhibernate 構成コードをテンプレートにコピーする必要があるかもしれません (うーん)。
私のDBラッパー:
private class DBSingleton
{
static DBSingleton()
{
string path = ConfigurationManager.AppSettings["DBConfigFileFullPath"];
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration().Configure(path);
cfg.AddInputStream(HbmSerializer.Default.Serialize(System.Reflection.Assembly.GetAssembly(typeof(Plan))));
instance = cfg.BuildSessionFactory();
}
internal static readonly ISessionFactory instance;
}
そして私のテンプレート:
<#
System.Diagnostics.Debugger.Launch();
string path = Host.ResolvePath(@"..\DB.UnitTest\App.config");
System.Configuration.ConfigurationManager.AppSettings.Add(
"DBConfigFileFullPath", path);
//System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(path); //Path to your config file
//System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
ReferenceValueBL bl = new ReferenceValueBL();
List<ReferenceValue> refVals = bl.Select(); <- problem occurs here
foreach(ReferenceValue rv in refVals)
{
Write("Public ");
Write(rv.ReferenceValueCode.GetType().Name);
Write(" ");
Write(rv.ReferenceValueCode);
Write(" = ");
Write(rv.ReferenceValueCode);
}
#>
私の問題は、bl 変数が select() を呼び出そうとしたときに発生します。それは、DBSingleton が初期化されるときです。アプリの設定が null であるというエラーがスローされます。DB クラスの相対ファイル パスを ./Dbconfig.xml にハード コードしても、実行中のアセンブリのローカル ディレクトリにそのファイルがないため、エラーがスローされます。
他の人は、テンプレート内の構成ファイルから読み取らずに、接続文字列を DAL に挿入せずに、t4 がアプリ/Web 構成ファイルを使用できるようにするにはどうすればよいでしょうか? 私にはそんな贅沢はありません。ファイルは読み取り可能な場所に配置するか、t4 がどこかを探す必要があります。