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);