强制实体框架在一次往返中更新多个记录。

时间:2016-07-07 14:05:16

标签: c# entity-framework linq

我必须更新EF中的多个记录,我想出了以下两种方法:

方法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 foreach:

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选择获取记录,然后更新每个更新的记录。

如果更改了DB中的任何内容,方法#2将给出编译时错误,而#1将给出运行时错误。

在这些案例中,人们认为最佳做法是什么?

有没有办法让两全其美?

1 个答案:

答案 0 :(得分:0)

您可能遇到的第一种方法问题将更加关键且难以解决,例如何时重命名/重组实体。编译时错误要好得多,运行时容易解决。

另外,我不确定ExecuteSqlCommand方法是如何工作的,但看起来这个代码很容易受到SQL注入攻击。 所以,我将明确选择linq方法。