0

我有两个表,它们几乎是彼此的完全克隆(相同的列,只是设置为主键的不同列)。基本上第二张表只是为了保存第一张表的历史。我需要做的是,当用户更新表 1 中的记录时,我需要将该记录的原始副本插入表 2。

我正在使用 LinqDataSource 对象并利用该LinqDataSource_Updating(object sender, LinqDataSourceUpdateEventArgs e)事件,因此我可以访问e.OriginalObject这将非常适合在表 2 中插入原始行。我的问题是我不想手动设置每个属性,因为大约有 50其中,所以我想使用反射,但不知道如何正确地去做。

考虑以下代码:

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

如何将所有_original' 的属性值复制到_history' ?我已经尝试使用这个问题的解决方案,但是它对我不起作用。它抛出错误:

Property DATE has an incompatible type in E_and_I.INSTRUMENT_DATA_SHEET_HISTORY

我的猜测是,这是因为该DATE列是表 2 中主键的一部分,而不是表 1。正如我所说,两个表之间的唯一区别是主键。它们供您参考:

主键

4

2 回答 2

1

我看到的问题是您的历史类型日期字段是DateTime,而您的原始字段是DateTime?(历史中的 REV 问题相同,它不能为空)。如果您的原始版本中有一个空的 DateTime 日期,您必须决定会发生什么。然后,您应该能够修改 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 回答