我必须在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方法。