zoukankan      html  css  js  c++  java
  • C# EF Attach 与 Entry

    先了解一下 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();
            }
  • 相关阅读:
    基于Appium的自动化case开发及case分层结构设计
    功能自动化接入持续集成方案
    Windows上部署Appium自动化测试框架
    Mac上部署Appium测试框架
    Appium原理简述
    开篇
    数据结构和算法动态可视化
    Request实现简易注册登录
    过滤器解决中文乱码
    简易登录拦截(没有登录前直接访问主页则跳转到登录页)
  • 原文地址:https://www.cnblogs.com/Aaxuan/p/10041051.html
Copyright © 2011-2022 走看看