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

本文关键字:更新 记录 一次 框架 实体 | 更新日期: 2023-09-27 17:56:03

我必须在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 });

方法二:林克:

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 将给出运行时错误。

在这种情况下,人们认为最佳实践是什么?

有没有办法两全其美?

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

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

另外,我不确定ExecuteSqlCommand方法是如何工作的,但看起来这段代码容易受到SQL注入的影响。所以,我肯定会选择linq方法。