我有两个表是彼此非常精确的克隆(相同的列,只是不同的列设置为主键)。基本上第二个表只是用于保存第一个表的历史记录。我需要做的是,当用户更新表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
的属性值复制到_history
?我尝试过使用this question中的解决方案,但它对我不起作用。它抛出错误:
Property DATE has an incompatible type in E_and_I.INSTRUMENT_DATA_SHEET_HISTORY
我的猜测是因为DATE
列是表2中主键的一部分,而不是表1.正如我所说,两个表之间的唯一区别是主键。这里他们供您参考:
答案 0 :(得分:1)
我看到的问题是,您的历史记录类型日期字段为DateTime
,而您的原始字段为DateTime?
(历史记录中的REV问题相同,不能为空)。如果原始版本中存在Date Date Date,则必须决定会发生什么。那么你应该能够修改Skeets代码(哦,亲爱的!)来专门处理这些字段,而不是其他字段。
答案 1 :(得分: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);
}
不是很优雅,但它完成了工作!