2015-10-06 3 views
0

У меня есть куча сущностей, которые необходимо обновить для соответствия объектам одного и того же класса в другой базе данных. Например:Обновление объекта с другим объектом в C# Entity Framework

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

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

Как я могу обновить Database1 для Geekguy123 поэтому новый FirstName Фредерик? Идентификаторы отличаются, но Пользователь уникален.

Чтобы быть ясным, на объекте есть несколько объектов, которые я не хочу обновлять вручную. Может быть, SQL будет проще?

+0

Это таблицы, а не базы данных ... – code4life

ответ

0

Просто запрос в базе данных 1 для записи, которую вы хотите. Получите его свойство FirstName, а затем запросите запись в базе данных 2, а затем обновите поле firstname с тем, которое вы получили из базы данных 1. И затем отправьте свое изменение.

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

Здесь вы идете - проходной 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 

И Passthrough будет выглядеть так:

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

У него есть таблицы в разных базах данных. – neo

+0

Тот же сервер? Затем просто нужно немного обновить прокси. Предполагая, что базы данных находятся на одном сервере. – code4life

0

Оказывается, там было на самом деле пару сотен свойств. Я закончил удаление и повторное добавление объекта с новыми значениями.

Смежные вопросы