首页 新闻 会员 周边 捐助

EF Core 更新数据变成添加数据

0
悬赏园豆:50 [已关闭问题] 关闭于 2022-01-26 14:18

问题:导入的Exce数据,如果数据库存在为更新,不存在为添加,出现的问题就是:添加没问题,但是有导入的数据,数据库存在,不会更新,而是又添加了一条数据。

同样的代码在EF中是没问题的,百度了好久,还是没解决!

DAL代码:
public void Update(T entity)
{
db.Set<T>().Update(entity);
SaveChanges();
}

Model 自增ID
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int OrderUserLogID { get; set; }

导入的代码:
foreach (DataRow dr in improtDt.Rows)
{
userModel.OrderUser_Name = dr["OrderUser_Name"].ToString();
userModel.OrderUser_Tel = dr["OrderUser_Tel"].ToString();
userModel.OrderUser_Company = dr["OrderUser_Company"].ToString();
userModel.OrderUser_Address = dr["OrderUser_Address"].ToString();
userModel.OrderUser_Type = dr["OrderUser_Type"].ToString();
userModel.OrderUser_CreateTime = DateTime.Now;
var isExist = userInfoBll.Exists(u => u.OrderUser_Name == userModel.OrderUser_Name);
if (isExist)
{
userInfoBll.Update(userModel);
}
else
{
addList.Add(userModel);
}
}
userInfoBll.Add(addList);
return Json(new ReturnJsonInfo(true, "用户信息导入成功!", null));

Luckyfish小文的主页 Luckyfish小文 | 菜鸟二级 | 园豆:335
提问于:2022-01-26 11:31
< >
分享
所有回答(1)
0

var isExist = userInfoBll.Exists(u => u.OrderUser_Name == userModel.OrderUser_Name);
你找一条存在的数据,然后就导入这一条,断点打到这一行,看看是不是库里查不到

三人乐乐 | 园豆:4823 (老鸟四级) | 2022-01-26 14:17

有存在的数据,断点isExist返回的是true
我现在知道原因了,但还不知道怎么处理;
原因是:数据库表OrderUserLogID 主键,且为自增例,而我导入EXCEL数据里,是没有OrderUserLogID这个字段的,百度了下,相当于传入了数据没有主键,自动转成add,尽管我写的是update

支持(0) 反对(0) Luckyfish小文 | 园豆:335 (菜鸟二级) | 2022-01-26 14:26

@Luckyfish小文: 那就很清楚了,你不要用Exists,用var model = Find(u => u.OrderUser_Name == userModel.OrderUser_Name).FirstOrDefault();然后判断是否有值,有值就先把实体状态改成changed(),再走就是更新了

支持(0) 反对(0) 三人乐乐 | 园豆:4823 (老鸟四级) | 2022-01-26 14:31

@三人乐乐: 非常感谢,我试下

支持(0) 反对(0) Luckyfish小文 | 园豆:335 (菜鸟二级) | 2022-01-26 14:33

@Luckyfish小文: 有个小建议,非必要尽量别在循环里读库,可以先把用户名OrderUser_Name取到一个列表,然后用In查出来放到list操作,存在就是changed,不存在就是created,最后一个savechanged的就行了

支持(0) 反对(0) 三人乐乐 | 园豆:4823 (老鸟四级) | 2022-01-26 14:35

@三人乐乐: ,非常感谢,后面搞定了,关键就是把主键值取出来,赋给要更新的model,实现了AddOrUpdate
判断部分改成:
var model = userInfoIBll.GetEntityOne(u => u.OrderUser_Name == userModel.OrderUser_Name);
if (model != null)
{
userModel.OrderUserLogID = model.OrderUserLogID;
}
using (var context = new OrderDbContent())
{
context.Entry(userModel).State = model!=null ?
EntityState.Modified :
EntityState.Added;
context.SaveChanges();
}

支持(0) 反对(0) Luckyfish小文 | 园豆:335 (菜鸟二级) | 2022-01-27 09:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册