1.新增,修改,或删除失败情况重复提交
例如:
public virtual bool Insert(T _t) { try { DBSET.Add(_t); _db.SaveChanges(); return true; } catch (Exception e) { log.Error("Insert:" + e.ToString()); return false; } }
假如新增一个异常实体,DESET.Add可以成功添加,但是执行_db.SaveChanges()的时候,提示主键重复了,不能保存。
然后我新增另一个正常实体,通过SQL监控,他仍然会先保存上一个异常的实体,导致正确的实体也不能被保存。
请问这种情况(修改、删除亦如此)应该怎么做?
我最笨的方法是在Catch里加入DBSET.Remove(_t);就正常了
问题二:DBContext有缓存
如我一个应用程序分Web,和移动端,web是采用entity framework的,而移动端采用普通的,当我用移动端修改数据的时候,web的EF并不能立即感知到数据库的变化,还是以前的数据,这样应该怎么处理?
应该是程序逻辑的问题,主键应该不是自增长的,看看是不是缓存的问题,没代码,自己理一下吧
主键是Guid的。
namespace ElegantWM.DAL { public class EFRepository<T> : IEFRepository<T> where T : class,IEntity { //日志 public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); //EF protected DbSet<T> DBSET = null; protected DB _db = null; //构造函数,不同数据库需要在子类里面重新赋值 public EFRepository(string _DBConStr = "DefaultDB") { _db = new DB(_DBConStr); //_db.Configuration.LazyLoadingEnabled = false; DBSET = _db.Set<T>(); } public virtual bool Insert(T _t) { try { DBSET.Add(_t); _db.SaveChanges(); return true; } catch (Exception e) { DBSET.Remove(_t); log.Error("Insert:" + e.ToString()); return false; } } } namespace ElegantWM.DAL { public class DB : DbContext { //public static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); //配置连接串,默认数据库DefaultDB public DB(string _ConnectStr) : base() { Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings[_ConnectStr].ToString(); Database.SetInitializer<DB>(null); //this.Configuration.LazyLoadingEnabled = false; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //已经存在的数据库,不然会出现负数 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); base.OnModelCreating(modelBuilder); } //注册到EF public DbSet<WMS_Role> wmRole { get; set; } public DbSet<WMS_User> wmUser { get; set; } public DbSet<WMS_Org> wmOrg { get; set; } public DbSet<WMS_Module> wmModule { get; set; } public DbSet<WMS_RoleModule> wmRoleModule { get; set; } public DbSet<WMS_UserRole> wmUserRole { get; set; } public DbSet<WMS_OrgUser> wmsOrgUser { get; set; } } }
@jackchain:
可能你创建的 EFRepository 是全局的,在insert发生异常时,肯定是要在catch 进行 remove的,不然
DBSET 依然有上一次的实体