首页新闻找找看学习计划

关于Entity Framework的两个疑问

0
悬赏园豆:50 [待解决问题]

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并不能立即感知到数据库的变化,还是以前的数据,这样应该怎么处理?

jackchain的主页 jackchain | 初学一级 | 园豆:95
提问于:2013-07-08 09:12
< >
分享
所有回答(1)
0

应该是程序逻辑的问题,主键应该不是自增长的,看看是不是缓存的问题,没代码,自己理一下吧

Yu | 园豆:12944 (专家六级) | 2013-07-08 10:08

主键是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; }
    }
}
支持(0) 反对(0) jackchain | 园豆:95 (初学一级) | 2013-07-08 10:11

@jackchain: 

可能你创建的 EFRepository 是全局的,在insert发生异常时,肯定是要在catch 进行 remove的,不然
DBSET 依然有上一次的实体
支持(0) 反对(0) Yu | 园豆:12944 (专家六级) | 2013-07-08 10:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册