2016-07-07 2 views
2

я должен обновить несколько записей в EF и я придумал со следующими двумя способами:Force Entity Framework для обновления нескольких записей в одном раунде.

Метод 1: ExecuteSqlCommand (прямой SQL)

customDB.Database.ExecuteSqlCommand(
@"UPDATE dbo.UserInfo 
SET  dbo.UserInfo.Email = dbo.IAMUser.Email, 
     dbo.UserInfo.Mobile = dbo.IAMUser.Phone 
FROM dbo.UserInfo 
     INNER JOIN dbo.IAMUserMapping ON dbo.UserInfo.UserID = dbo.IAMUserMapping.fUserId 
     INNER JOIN dbo.IAMUser ON IAMUser.IAMID = IAMUserMapping.fIAMID 
WHERE dbo.IAMUser.IAMID = @iamid ", new SqlParameter("@iamid", SqlDbType.UniqueIdentifier) { Value = IAMID }); 

Метод 2: Linq Еогеасп:

var ui = from userInfo in customDB.UserInfo 
    join userMapping in customDB.IAMUserMapping 
     on userInfo.UserID equals userMapping.fUserId 
    join iamUser in customDB.IAMUser 
     on userMapping.IAMUser.IAMID equals iamUser.IAMID 
    where iamUser.IAMID == IAMID 
    select new 
    { 
     userInfo.UserID, 
     iamUser.Email, 
     iamUser.Phone 
    }; 

foreach (var x1 in ui) 
{ 
    var u = new UserInfo 
    { 
     UserID = x1.UserID, 
     Email = x1.Email, 
     Mobile = x1.Phone 
    }; 
    customDB.UserInfo.Attach(u); 
    var entry = customDB.Entry(u); 
    entry.Property(e => e.Email).IsModified = true; 
    entry.Property(e => e.Mobile).IsModified = true; 
} 
customDB.SaveChanges(); 

Метод № 1 является наиболее эффективным, в результате чего возникает один запрос SQL.

Метод №2 так же эффективен на стороне SQL Server, но он генерирует намного больше круговых поездок на сервер. 1 выберите, чтобы получить записи, затем 1 обновление для каждой обновленной записи.

Метод №2 даст ошибку времени компиляции, если что-либо в БД будет изменено, а # 1 даст ошибку времени выполнения.

Что люди считают лучшей практикой в ​​таких случаях?

Есть ли способ получить лучшее из обоих миров?

+1

Существует известная ошибка в разметке SO, которая вызывает проблемы с форматированием кода в нумерованных списках. Я просто отказался от редактирования, что сделало его еще хуже, поэтому я не могу сейчас это исправить. Просто [править] и избавиться от нумерованного списка и правильно отформатировать код в качестве кода. – Will

+0

Я видел это на столбе, исправил его, написав метод спереди. Ty для редактирования. – devzero

+0

* Лучшая практика * делает этот вопрос вне темы в Stack Overflow (основанный на мнениях, и трудно ответить, потому что вам решать взвешивать компромиссы обоих методов). * любой другой способ оптимизировать этот запрос? * Здесь лучше задать вопрос, но даже тогда можно утверждать, что CodeReview лучше подходит. –

ответ

0

С проблемами первого подхода, с которыми вы можете столкнуться, будет гораздо более важно и сложнее решить, например. при переименовании/реструктуризации юридических лиц. Ошибки времени компиляции намного лучше, их легко решить, а затем запустить.

Кроме того, я не уверен, как работает метод ExecuteSqlCommand, но выглядит так, что этот код уязвим для SQL Injection. Итак, я определенно подберу подход linq.

+0

ExecuteSqlCommand безопасен, пока вы используете параметры. Сгенерированный SQL, если трассировка с использованием профилировщика равна. – devzero

+0

Я не согласен с точкой 1, но это скорее вопрос. В точке 2 он параметризуется, поэтому нет риска внедрения sql. В примере OPs код даже проходит в экземпляре 'SqlParameter', чтобы проиллюстрировать его. – Igor

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