我的数据库中有两个包含相同列的表。我在一个表(名为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个)。
由于它们具有相同的属性,我认为必须有一种更简单的方法来执行此过程,但我不知道如何。
是否有更简单的方法来“传输”此数据?
答案 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';" );