问题:导入的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));
var isExist = userInfoBll.Exists(u => u.OrderUser_Name == userModel.OrderUser_Name);
你找一条存在的数据,然后就导入这一条,断点打到这一行,看看是不是库里查不到
有存在的数据,断点isExist返回的是true
我现在知道原因了,但还不知道怎么处理;
原因是:数据库表OrderUserLogID 主键,且为自增例,而我导入EXCEL数据里,是没有OrderUserLogID这个字段的,百度了下,相当于传入了数据没有主键,自动转成add,尽管我写的是update
@Luckyfish小文: 那就很清楚了,你不要用Exists,用var model = Find(u => u.OrderUser_Name == userModel.OrderUser_Name).FirstOrDefault();然后判断是否有值,有值就先把实体状态改成changed(),再走就是更新了
@三人乐乐: 非常感谢,我试下
@Luckyfish小文: 有个小建议,非必要尽量别在循环里读库,可以先把用户名OrderUser_Name取到一个列表,然后用In查出来放到list操作,存在就是changed,不存在就是created,最后一个savechanged的就行了
@三人乐乐: ,非常感谢,后面搞定了,关键就是把主键值取出来,赋给要更新的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();
}