我必须更新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将给出运行时错误。
在这些案例中,人们认为最佳做法是什么?
有没有办法让两全其美?
答案 0 :(得分:0)
您可能遇到的第一种方法问题将更加关键且难以解决,例如何时重命名/重组实体。编译时错误要好得多,运行时容易解决。
另外,我不确定ExecuteSqlCommand方法是如何工作的,但看起来这个代码很容易受到SQL注入攻击。 所以,我将明确选择linq方法。