[英]Copying a row from one table to another using LINQ and C#
我有兩個表,它們幾乎是彼此的精確克隆(相同的列,只是將不同的列設置為主鍵)。 基本上,第二個表僅用於保留第一個表的歷史記錄。 我需要做的是,當用戶更新表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
? 我已嘗試使用此問題的解決方案,但是它不適用於我。 它引發錯誤:
Property DATE has an incompatible type in E_and_I.INSTRUMENT_DATA_SHEET_HISTORY
我的猜測是,這是因為DATE
列是表2中主鍵的一部分,而不是表1中的主鍵。正如我所說,兩個表之間的唯一區別是主鍵。 這里供您參考:
我看到的問題是,您的“歷史記錄”類型的“日期”字段是DateTime
而您的“原始”類型是DateTime?
(與“歷史記錄”中的REV相同的問題,不能為null)。 如果原始版本中的DateTime為空,則必須決定會發生什么。 然后,您應該能夠修改Skeets代碼(哦,親愛的!),以與其他字段不同的方式專門處理這些字段。
好了,我設法弄清楚了:)這是我做的:
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);
}
不是很優雅,但是可以完成工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.