当前位置:编程学习 > C#/ASP.NET >>

关于Entity Framework的两个疑问

1.新增,修改,或删除失败情况重复提交
例如:
public virtual bool Insert(T _t)
        {
            try
            {
                DBSET.Add(_t);//DBSET=DbSet<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并不能立即感知到数据库的变化,还是以前的数据,这样应该怎么处理? Entity Framework --------------------编程问答-------------------- 1.使用_db.AddObject()试试
2.使用_db.Refresh()试试 (这个我不太清楚了) --------------------编程问答-------------------- 你的主键没有设置自动增长? 怎么会用重复主键的情况出现? 
  为何不用事务,当出现异常时,进行 RollBack操作 --------------------编程问答-------------------- 问题1,DBSET中是否用了单例了?

问题2,是否也用单例了~

web是否有自己的缓存~

EF5.0有一个查询方法 只查缓存,不会去查数据库,忘记方法名叫什么了~ --------------------编程问答-------------------- 主键自增了~~~ --------------------编程问答-------------------- 我主键不是自增的是Guid的,
重复的情况我只是举例子,那比如用户名字段,只允许保存5字符,我输入六个,没有校验后保存,肯定会保存失败的,怎么弄?
关于单例模式是什么意思呢? --------------------编程问答-------------------- 同样的问题,求解决啊。 --------------------编程问答-------------------- 1 放弃原来的context,这样就不会存在了,如果仍然使用原来的context,但要remove
2 不明白,怎么叫感知数据库的变化,你用了什么方法使它能感知? 触发吗?

其实1的做法很奇怪,你已经知道有可能会重复,为什么事先不检查?锁表-〉取数据检查-〉保存或者放弃-〉解锁,这个应该是正确的做法吧? --------------------编程问答-------------------- Insert 重复说明你调用的地方逻辑错误,否则同一笔数据怎么会执行多次。 --------------------编程问答-------------------- 你两个需求其实冲突滴

需求1之所以如此,正是因为你全局公用了DBContext,最简单解法,重新new一个DBContext即可

需求2俺你目前的解放是正确滴,因为你全局公用的DBContext,所以修改在缓存中即可看到,所以web应该木问题,你刷新一下就可以看到结果,当然如果你两东西使用的是不同DBContext结果当然有可能不同(如果你两边都如你需求1一样的处理,两边分别是两个公用的DBContext,自然这两个DBContext缓存的数据自然并不相同) --------------------编程问答-------------------- 问题一, savechanges是把整个 dbcontext中的数据提交到数据库,你第一实体提交出错(Guid主键可以在数据库是加  newid()默认值 ),但还存在与dbcontext中,第二个实体Add后,是连第一个出错的实休一起再一次提交,所以还是提交出错。
问题二,
可能是架构问题,不管web还是移动访问,一个dbcontext的生命周期应该对应一个请求,如果你的dbcontext对象的生命周期存在与多个请求中就会出现你碰到的问题。
建议用依赖注入工具,还有entity framework建议用code first
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,