Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ和C将一行从一个表复制到另一个表#_C#_Linq_Linq To Sql - Fatal编程技术网

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

C# 使用LINQ和C将一行从一个表复制到另一个表#,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有两个表,它们几乎是彼此的克隆(相同的列,只是不同的列被设置为主键)。基本上,第二个表只是用来保存第一个表的历史记录。我需要做的是,当用户更新表1中的记录时,我需要将该记录的原始副本插入表2中 我正在使用一个LinqDataSource对象,并利用LinqDataSource\u更新(对象发送方,LinqDataSourceUpdateEventArgs e)事件,因此我可以访问e.OriginalObject,这将非常适合在表2中插入原始行。我的问题是,我不想手动设置每个属性,因为大约有50

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

我正在使用一个LinqDataSource对象,并利用
LinqDataSource\u更新(对象发送方,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();
如何将所有
\u原始
的属性值复制到
\u历史
?我已经尝试使用来自的解决方案,但是它对我不起作用。它抛出错误:

属性日期在E_和I.仪器数据表历史记录中的类型不兼容

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


我看到的问题是,您的历史记录类型日期字段是
DateTime
,而您的原始字段是
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);
}

不是很优雅,但它完成了任务

您是否考虑过使用SQL触发器而不是在代码中执行此操作?我宁愿在代码中执行此操作:)这正是我试图实际执行的操作-虽然还没有弄清楚…@Hoff我认为您应该使源表
中的列也不为null
,因为这显然是一个要求:如果其中一个值为null,则无法创建历史记录。同意-我很喜欢被别人的数据库设计(懒惰且未经深思熟虑的)打伤。