0

互いにほぼ正確なクローンである2つのテーブルがあります(同一の列、主キーとして設定された異なる列のみ)。基本的に、2番目のテーブルは最初のテーブルの履歴を保持するためのものです。私がする必要があるのは、ユーザーがテーブル1のレコードを更新するときに、そのレコードの元のコピーをテーブル2に挿入する必要があるということです。

LinqDataSourceオブジェクトを使用してLinqDataSource_Updating(object sender, LinqDataSourceUpdateEventArgs e)イベントを利用しているので、アクセスできe.OriginalObject、テーブル2に元の行を挿入するのに最適です。私の問題は、約50あるため、すべてのプロパティを手動で設定する必要がないことです。そのうち、Reflectionを使用したいのですが、適切に処理する方法がわかりません。

次のコードを検討してください。

INSTRUMENT_DATA_SHEET _original = (INSTRUMENT_DATA_SHEET)e.OriginalObject;
INSTRUMENT_DATA_SHEET_HISTORY _history = new INSTRUMENT_DATA_SHEET_HISTORY();

_originalすべての'sプロパティ値を'sにコピーするにはどうすればよい_historyですか?この質問の解決策を使用してみましたが、うまくいきません。エラーが発生します:

Property DATE has an incompatible type in E_and_I.INSTRUMENT_DATA_SHEET_HISTORY

私の推測では、DATE列がテーブル2の主キーの一部であるが、テーブル1の一部ではないためです。前述したように、2つのテーブルの唯一の違いは主キーです。ここにそれらはあなたの参照のためです:

主キー

4

2 に答える 2

1

私が見る問題は、履歴タイプの日付フィールドがDateTimeであり、元のフィールドがであるということですDateTime?(履歴のREVと同じ問題で、nullにすることはできません)。元のバージョンにnullのDateTimeofDateがある場合にどうなるかを決定する必要があります。次に、Skeetsコードを変更して(ああ、親愛なる!)、これらのフィールドを他のフィールドとは異なる方法で処理できるようにする必要があります。

于 2012-08-08T16:48:28.153 に答える
0

わかりました、私はそれを理解することができました:)これが私がしたことです:

INSTRUMENT_DATA_SHEET _original = (INSTRUMENT_DATA_SHEET)e.OriginalObject;
INSTRUMENT_DATA_SHEET_HISTORY _history = new INSTRUMENT_DATA_SHEET_HISTORY();

foreach (PropertyInfo pi in _original.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
    _history.GetType().GetProperty(pi.Name).SetValue(_history, pi.GetValue(_original, null), null);
}

あまりエレガントではありませんが、それは仕事を成し遂げます!

于 2012-08-08T17:11:01.490 に答える