public virtual void Add(TEntity entity) { if (entity == null) { throw new Exception("Add 方法中的 entity 不能为 null"); } dbSet.Add(entity); } public virtual int SaveChanges() { baseDbContext.Configuration.ValidateOnSaveEnabled = false;//关闭实体属性验证 int result = baseDbContext.SaveChanges(); return result; }
奇怪的是,单独用一个测试方法,却可以将数据保存到数据库。
public void Test() { for (int i = 0; i < 3; i++) { bTRepastanalyseBLLef.Add(new TRepastanalyse() { CreateId = 1, Createtime = DateTime.Now, ChinesefoodStatus = 0, DinnerStatus = 1, PersonId = 173, RepastDate = DateTime.Now, UpdateId = 1, Updatetime = DateTime.Now }); } bTRepastanalyseBLLef.SaveChanges(); }
这个的问题的发生场景:在前台页面上传一个Excel文件,后台遍历每行每列,每一行形成一个对象,每遍历一行就添加一个对象到EF上下文,循环完成后再调用 SaveChanges 保存,却发现返回值为0,上下文的Local属性里面可以看到刚才所有已添加的对象。
baseDbContext对象是否是同一个?
这个的问题的发生场景:在前台页面上传一个Excel文件,后台遍历每行每列,每一行形成一个对象,每遍历一行就添加一个对象到EF上下文,循环完成后再调用 SaveChanges 保存,却发现返回值为0,上下文的Local属性里面可以看到刚才所有已添加的对象。
@thislong: 调用Add方法的对象是不是同一个对象.
有可能是实体模型验证没有通过,和数据库设计不一样。可以用try catch来调试一下看看是哪里错了。
1 try 2 { 3 int result = context.SaveChanges(); 4 } 5 catch (DbEntityValidationException dbEx) 6 { 7 foreach (var validationErrors in dbEx.EntityValidationErrors) 8 { 9 foreach (var validationError in validationErrors.ValidationErrors) 10 { 11 System.Diagnostics.Trace.TraceInformation("Property: {0} Error: {1}", 12 validationError.PropertyName, 13 validationError.ErrorMessage); 14 } 15 } 16 throw; 17 }
和数据库表的字段是一样的,我已经关闭了实体属性验证