• DbSet中Find,AsNoTracking,Attach及DBEntityEntry,ChangeTracker


    Find,AsNoTracking,Attach,DBEntityEntry,ChangeTracker,Local


    一:DBSet

    我们在SaveChange的时候,如果获取到DbSet中一些Entity的变化。。。。


    二:我们如果动态的detect这些entity的变化。。。

    1. DBEntityEntry.... 可以获取的到某一个entity的实时状态。。。

    db.Entry => 它的result类型。。

    《1》 可以被detect entity的哪些属性:

    State: Modified

    OriginalValues: myentity.OriginalValues["StudentName"]

    CurrentValues: myentity.CurrentValues["StudentName"]


    2. ChangeTracker: 可以获取得到当前dbcontext下面的所有entity的变化。。。。

    result类型就是 IEnumerable<DbEntityEntry>


    {System.Data.Entity.Infrastructure.DbEntityEntry}
    CurrentValues: {System.Data.Entity.Infrastructure.DbPropertyValues}
    Entity: {ConsoleApplication30.Student}
    InternalEntry: {System.Data.Entity.Internal.InternalEntityEntry}
    OriginalValues: “(entityList.FirstOrDefault()).OriginalValues”引发了类型“System.InvalidOperationException”的异常
    State: Added
    _internalEntityEntry: {System.Data.Entity.Internal.InternalEntityEntry}

    using (SchoolDBEntities db = new SchoolDBEntities())
    {
    //update操作
    var item = db.Students.FirstOrDefault();
    item.StudentName = "张三";

    //add操作
    db.Students.Add(new Student() { StudentName = "王五" });

    //删除操作
    var myitem = db.Students.FirstOrDefault(i => i.StudentID == 3);
    db.Students.Remove(myitem);

    //检测到当前db下面所有被跟踪的实体
    var entityList = db.ChangeTracker.Entries();

    foreach (var entity in entityList)
    {

    }
    }


    从这个例子中,我们可以看到,确实可以跟跟踪,方便我们去检测entity的状态。。。。


    三:Local

    这个Local只跟踪CUR操作。。。 ChangeTracker有一点点不一样。。。

    Local只能针对某一个DBset而言。。。

    ChangeTracker可以跟踪整个DbContext。。。。

    Entry 只能跟踪某一个实体。。。


    四:看一下DBSet下面的其他属性

    using (SchoolDBEntities db = new SchoolDBEntities())
    {
    //update操作
    var item = db.Students.FirstOrDefault();
    item.StudentName = "张三";

    //add操作
    db.Students.Add(new Student() { StudentName = "王五" });

    //删除操作
    var myitem = db.Students.FirstOrDefault(i => i.StudentID == 3);
    db.Students.Remove(myitem);

    foreach (var mylocal in db.Students.Local)
    {

    }

    ////检测到当前db下面所有被跟踪的实体
    //var entityList = db.ChangeTracker.Entries();

    //foreach (var entity in entityList)
    //{

    //}
    }

    1. AsNoTracking()

    using (SchoolDBEntities db = new SchoolDBEntities())
    {
    //update操作
    var item = db.Students.AsNoTracking().FirstOrDefault();
    item.StudentName = "张三";

    var item2 = db.Students.FirstOrDefault();
    item2.StudentName = "李四";

    var track1 = db.Entry(item);

    var trace2 = db.Entry(item2);
    }

    track1
    {System.Data.Entity.Infrastructure.DbEntityEntry`1[ConsoleApplication30.Student]}
    CurrentValues: “track1.CurrentValues”引发了类型“System.InvalidOperationException”的异常
    Entity: {System.Data.Entity.DynamicProxies.Student_3D2C2AEAA0104FF4F10F5ECE055C297922EDA7306BF72635BE0EE3A849DCA14A}
    OriginalValues: “track1.OriginalValues”引发了类型“System.InvalidOperationException”的异常
    State: Detached
    _internalEntityEntry: {System.Data.Entity.Internal.InternalEntityEntry}
    trace2
    {System.Data.Entity.Infrastructure.DbEntityEntry`1[ConsoleApplication30.Student]}
    CurrentValues: {System.Data.Entity.Infrastructure.DbPropertyValues}
    Entity: {System.Data.Entity.DynamicProxies.Student_3D2C2AEAA0104FF4F10F5ECE055C297922EDA7306BF72635BE0EE3A849DCA14A}
    OriginalValues: {System.Data.Entity.Infrastructure.DbPropertyValues}
    State: Modified
    _internalEntityEntry: {System.Data.Entity.Internal.InternalEntityEntry}


    DbSet仓储模式自带的一个Find操作。。。

    //update操作
    var item = db.Students.Find(2);

  • 相关阅读:
    Jquery才可以使用 this 指定当前DOM
    微擎使用腾讯地图拾取坐标
    使用 MUI 自制 弹出层
    mui 底部导航栏
    PHP 向数组头部插入数据
    a 标签添加 onclick 事件
    # & 等特殊字符会导致传参失败
    HTML 颜色输入框修改事件的触发,以及获取修改后的颜色
    C++ malloc()函数的注意点及使用示例
    C++ malloc函数
  • 原文地址:https://www.cnblogs.com/dragon-L/p/6551176.html
Copyright © 2020-2023  润新知