• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#EFAttach与Entry

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

先了解一下 EF 框架的 EntityState

在使用EF框架时,

我们通常都是通过调用 SaveChanges() 方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加、修改还是删除呢?

答案是通过EntityState的枚举值来判断的。也就是说在操作数据库时,EF会根据EntityState这个枚举检测到实体的状态,然后执行相应的增/删/改操作。

该状态对应的值为以下五种:

Detached:对象存在,但未由对象服务跟踪。在创建实体之后、但将其添加到对象上下文之前,该实体处于此状态;
Unchanged:自对象加载到上下文中后,或自上次调用 System.Data.Objects.ObjectContext.SaveChanges() 方法后,此对象尚未经过修改;
Added:对象已添加到对象上下文,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法;
Deleted:使用 System.Data.Objects.ObjectContext.DeleteObject(System.Object) 方法从对象上下文中删除了对象;
Modified:对象已更改,但尚未调用 System.Data.Objects.ObjectContext.SaveChanges() 方法。

 

Attach()  :将给定实体以 System.Data.EntityState.Unchanged 状态附加到上下文中。

从解释可以看出Attach方法主要目的就是把一个没有被 dbContext 跟踪的对象附加到 dbCotext 中使其被 dbContext 跟踪。

Attach执行成功的前提:

1. 如果上下文中已经存在与实体对象键值相同的对象A,则要求实体对象的内存地址必须与对象A相同,否则报错:“已有相同键值的对象存在上下文中......”。

2. 如果上下文中不存在与实体对象键值相同的对象,则要求实体对象的内存地址必须不在上下文中,否则会报错,系统认为在修改键值,这是不允许的。

例如,在删除中使用

        public int Delete(T entity)
        {
            DB.Set<T>().Attach(entity);
            DB.Set<T>().Remove(entity);
            return DB.SaveChanges();
        }


Entry()  :获取实体对象的代理类

如果实体对象不在当前上下文中(指内存地址),则代理类对象的State为Detached,否则,为上下文中相应所处状态。

例如:在更新中使用

        public int Updata(T entity,params string[] propNames)
        {
            var oldEntity = DB.Entry(entity);
            oldEntity.State = EntityState.Unchanged;

            foreach (var prop in propNames)
            {
                oldEntity.Property(prop).IsModified = true;
            }

            return DB.SaveChanges();
        }

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap