2015-10-06 132 views
0

我有一堆实体需要更新以匹配不同数据库中同一类的实体。例如:在C#实体框架中使用另一实体更新实体

Database1 TableA: 
Id| User  | FirstName| LastName 
1 | Geekguy123 | Fred  | Smith 

Database2 TableA: 
Id| User  | FirstName| LastName 
34| Geekguy123 | Frederick| Smith 

如何更新Geekguy123的database1,使新的FirstName是Frederick? ID不同,但用户是唯一的。

要清楚,实体上有几十个属性,我不想手动更新。也许SQL会更容易?

+0

这些是表格,而不是数据库... – code4life

回答

0

只需在数据库1中查询您想要的记录即可。获取其FirstName属性,然后查询数据库2中的记录,然后使用从数据库1获得的名称更新firstname字段。然后提交您的更改。

Db1Context c1 = new Db1Context(); 
var userToUpdateWith = c1.Users.Single(u => u.User == "Geekguy123") 

Db2Context c2 = new Db2Context(); 
var userToUpdate = c2.Users.Single(u => u.User == "Geekguy123") 

由于您必须设置许多属性,您可以执行以下操作。

string[] properties = new string[]{"FirstName","LastName"}; 

foreach(var property in properties){   
    object value = userToUpdateWith.GetType().GetProperty(property).GetValue(userToUpdateWith, null); 
    userToUpdate.GetProperty(property).SetValue(userToUpdate, value, null);  

c2.SaveChanges(); 
+0

不幸的是,这个实体有几十个属性,我不想手动更新 – Ben

+0

然后使用反射。创建一个你感兴趣的属性名称数组,然后遍历它们并通过反射更新。 – neo

0

在这里你可以使用 - 你可以使用的pass-through SQL。

如果表名是确实是 Database1,则相应地替换Table1,Table2

 
UPDATE t1 
    SET t1.FirstName = t2.FirstName 
    FROM Database1.dbo.Table1 AS t1 
    INNER JOIN Database2.dbo.Table2 AS t2 
    ON t1.User = t2.User 

而且直通会是这样:

 
using (var context = new YourDataContext()) 
{ 
    context.Database.ExecuteSqlCommand(sqlString); 
} 
+0

他在不同的数据库中有表格。 – neo

+0

同一台服务器?然后只需要稍微更新一遍。假设数据库位于同一台服务器上。 – code4life

0

事实证明,实际上有几百性能。我最终删除并重新添加了具有新值的实体。