• 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();
            }
  • 相关阅读:
    import和include的区别
    $sformat用法
    如何快速理解DUT
    vim_basic
    UVM——寄存器模型相关的一些函数
    AMBA——总线仲裁
    Cache的写回策略(转)
    Cache直接映射、组相连映射以及全相连映射(转载)
    一起学IC验证:推荐资料合集,收藏专用(转载)
    VCS仿真流程
  • 原文地址:https://www.cnblogs.com/Aaxuan/p/10041051.html
Copyright © 2020-2023  润新知