使用LINQ和C#将一行从一个表复制到另一个表

时间:2012-08-08 15:59:19

标签: c# linq linq-to-sql

我有两个表是彼此非常精确的克隆(相同的列,只是不同的列设置为主键)。基本上第二个表只是用于保存第一个表的历史记录。我需要做的是,当用户更新表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.正如我所说,两个表之间的唯一区别是主键。这里他们供您参考:

Primary Keys

2 个答案:

答案 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);
}

不是很优雅,但它完成了工作!