背景NHibernateのメタデータから、クラスのフィールド名とテーブルのカラム名を取得
私は醜いコーナーのすべての種類のレガシーデータベースを使用しています。 1ビットは監査です。監査証跡を持つべきフィールドのテーブル名/フィールドの組み合わせを列挙したテーブルがあります。たとえば、テーブル名に「WORKORDER」、フィールド名に「STATUS」を持つ行がある場合、アプリケーションでWorkorder.Statusプロパティが変更されるたびに監査テーブルに行を追加する必要があります。私はNHのイベントやインターセプタというアプローチを知っていますが、私がその段階に入る前に把握しなければならない問題があります。私が知っている必要があり何
質問
は、(a)において、データベースのフィールド名と、(b)は、関連するプロパティ名を含む単一の永続クラスのためのキー/値ペアのリストを取得する方法ですクラス。したがって、私の例では、ワークオーダーと呼ばれるクラスがWORKORDERと呼ばれるテーブルに関連付けられています。私はそのWorkorderクラスのCurrentStatusというプロパティを持っています。 WORKORDER表の一致プロパティーはSTATUSです。プロパティ名とテーブルの列名が一致していないことに注目してください。監査の前後のデータにアクセスするには、プロパティ名を知る必要があります。しかし、私は愚かなレガシー "AuditTheseColumns"テーブルを照会できるように、バッキング列名を知る必要もあります。
は、私は自分のアプリケーションに
を試してみた私は、 "TS" と "IP" からWorkorder.CurrentStatusを変更します。監査追跡テーブルを見て、WORKORDER.STATUS列が追跡されていることを確認します。 Session.SaveOrUpdate(workorder)を呼び出した後、STATUS列に関連付けられたWorkorderプロパティを見つけ、古い( "TS")値と新しい( "IP")値を示すSession.Save(auditRecord)を実行する必要があります。
var fieldNames = new List<string>();
IClassMetadata classMetadata = SessionFactory(Resources.CityworksDatasource).GetClassMetadata(typeof(T));
int propertyCount = 0;
foreach (IType propertyType in classMetadata.PropertyTypes)
{
if (propertyType.IsComponentType)
{
var cp = (ComponentType)propertyType;
foreach (string propertyName in cp.PropertyNames)
{
fieldNames.Add(propertyName);
}
}
else if(!propertyType.IsCollectionType)
{
fieldNames.Add(classMetadata.PropertyNames[propertyCount + 1]);
}
propertyCount++;
}
とテーブルに関する情報:
var columnNames = new List<string>();
PersistentClass mappingMeta = ConfigureCityworks().GetClassMapping(typeof(T));
foreach (Property property in mappingMeta.PropertyIterator)
{
foreach (Column selectable in property.ColumnIterator)
{
if (columnNames.Contains(selectable.Name)) continue;
columnNames.Add(selectable.Name);
}
}
しかし同時にではない
私の知る限り、あなたはクラスについての情報を得ることができます。何か案は?私は次にどこを見なければならないのか分かりません。
これが直接あなたの質問に関連していないが、それはアイデアかもしれません - あなたはなぜデータベース上のオブジェクトレベルの変更を監査しないのですか?エンドユーザーはUIレベルの.NETオブジェクトを処理しています。また、.NETデータオブジェクトはデータベースオブジェクト(テーブル、ビューなど)を1:1に反映しているだけでなく、.NETオブジェクトのイベントをデータベースもの。どう思いますか? – Leo
もしそれが私のものだったら、私はそのタイプのアプローチを間違いなく見ています。残念ながら、私はよく確立された製品の背後にあるデータベースを使って作業しており、監査の方法を迂回することはできません。そう、はい、私は欲しい!しかし、残念なことに、このプロジェクトの実行可能なアプローチではありません。 – Dylan
私のために;私はテーブル名とキー列名を格納する定数を使うことにしました。その後、nhibernateマッピングファイルとraw tsqlの定数を使用します – kite