如何使用EF将数据从一个表“传输”到另一个表?

时间:2016-06-16 14:30:42

标签: entity-framework

我的数据库中有两个包含相同列的表。我在一个表(名为TB1)中有一条记录,我希望使用EF将其“转移”到另一个表(名为TB2)。

我对EF不是很熟悉,所以我的想法是朝这个方向发展的:

var testEntity = new TestEntities();
var data1 = testEntity.TB1.Find(id);
var data2 = new TB2();

// Pass all the properties from one object (data1) to another (data2)

testEntity.TB2.Add(data2);
testEntity.TB1.Remove(data1);
testEntity.SaveChanges();

但是,为了继续这个逻辑,我必须手动将所有属性从一个对象传递到另一个对象。它包含很多属性(大约50个)。

由于它们具有相同的属性,我认为必须有一种更简单的方法来执行此过程,但我不知道如何。

是否有更简单的方法来“传输”此数据?

2 个答案:

答案 0 :(得分:3)

实体框架具有处理复制对象属性的功能。请参阅https://msdn.microsoft.com/en-us/data/jj592677.aspx

最简单的方法是使用CurrentValues.SetValues()

var testEntity = new TestEntities();
var data1 = testEntity.TB1.Find(id);
var data2 = new TB2();

data2.CurrentValues.SetValues(data1);

testEntity.TB2.Add(data2);
testEntity.TB1.Remove(data1);
testEntity.SaveChanges();
  

有时在使用从n层应用程序中的服务调用或客户端获取的值更新实体时使用此技术。请注意,所使用的对象不必与实体具有相同的类型,只要它具有与实体名称匹配的属性即可。

答案 1 :(得分:3)

您还可以使用SQL在SQL Server中的表之间传输数据。这是一种非常快速的方法,但对于干净的编码器来说它并不是很干净。

您可以创建一个界面,例如IExecuteSQLQuery使用方法Excute(DbContext)和类TransferDataFromT1ToT2:IEexcuteSQLQuery,这样您将获得处理sql文本的通用方法。

dbContext.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, 
"INSERT INTO T2 (CustomerName, Country) 
SELECT SupplierName, Country FROM T1 
WHERE Country ='Germany';" );