ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Entity Framework(02):模型优先 ,ObjectContext类

2020-07-03 14:02:00  阅读:254  来源: 互联网

标签:02 Console ObjectContext 对象 实体 ctx Entity ObjectStateManager ose


https://www.cnblogs.com/ejiyuan/archive/2009/05/27/1490786.html

1、ObjectContext

封装.NET Framework和数据库之间的连接。此类用作“创建”、“读取”、“更新”和“删除”操作的网关。

ObjectContext类为主类,用于与作为对象(这些对象为EDM中定义的实体类型的实例)的数据进行交互。

ObjectContext类的实例封装以下内容:

  • 到数据库的连接,以EntityConnection对象的形式封装。
  • 描述该模型的元数据,以MetadataWorkspace对象的形式封装。
  • 用于管理缓存中持久保存的对象的ObjectStateManager对象。

ObjectContext类的成员方法以说明如下所示:

  • Attach(string,object):将实体对象附加到指定的实体容器中
  • AddObject(string,object):将实体对象添加到制定的实体容器中
  • Detach(object):移除指定的实体对象
  • DeleteObject(object):删除指定的实体对象
  • GetObjectByKey(System.Data.EntityKey key):通过主键KEY从ObjectStateManager中检索对象(如果存在);否则从存储区中检索。
  • TryGetObjectByKey(System.Data.EntityKey,out object):尝试从指定实体主键返回该实体
Racer frnado = ctx.Races.Where("it.Lastname=Alne").First;
EntityKey key = frnado.EntityKey;
ctx.Races.Detach(frnado);
frnado.Starts++;
Racer frnado1 = ctx.GetObjectByKey(key) as Racer;
ctx.ApplyCurrentValues(frnado);
  • ApplyPropertyChanges(string,object):将以指派的实体对象属性的更改应用到容器中对应的原对象。
  • AcceptAllChanges():接受所有对该实体对象的更改
  • SaveChanges(bool):将所有更新持久保存到存储区中。参数是客户端事务支持所需的参数。参数为true则在更新后自动将更改应用到ObjectStateManager中的实体。如果为false,则在更新后还需要调用AcceptAllChanges()以便更新ObjectStateManager中的实体。
  • Refresh(System.Data.Objects.RefreshMode refreshMode, object entity):按指定持久更新模式,使用指定实体的存储区数据更新ObjectStateManager。
int changes = 0;
try
{
    changes += ctx.SaveChanges();
}
catch (OptimisticConcurrencyException ex)
{
    ctx.Refresh(System.Data.Objects.RefreshMode.ClientWins, ex.StateEntries);
    changes += ctx.SaveChanges();
}
Console.WriteLine("实体改变数量" + changes);
  • CreateQuery<T>(string,params ObjectParameter[]):从给定的查询字符串创建ObjectQuery对象。
  • ExecuteFunction<TElement>(string,params ObjectParameter[]):对默认容器执行给定的函数。
string esql = "SELECT VALUE DBItemList FROM myContext.DBItemList";
// ObjectQuery<DBItemList> query = new ObjectQuery<DBItemList>(esql, context);  
ObjectQuery<DBItemList> query = ctx.CreateQuery<DBItemList>(esql);
foreach (DBItemList r in query)
{
    Console.WriteLine(r.NameID);
}

2、ObjectQuery

有个有用的方法ToTraceString(),这个方法用于追踪所执行的SQL语句,通过此方法我们可以获取所执行的SQL语句,以便我们查看、分析具体执行的SQL语句。(类似Nhibernate配置文件中的showsql节)

3、ObjectStateEntry

ObjectStateEntry维护实体实例或关系实例的状态(已添加、已删除、已分离、已修改或未更改)、键值和原始值。还管理已修改属性的列表。其包含一下方法:

  • AcceptChanges():接受当前值作为原始值,并将实体标记为Unchanged()。
  • Delete():将实体标记为Deleted()。如果实体处于Added()()()状态,它将为Detached()。
  • GetModifiedProperties():返回标记为Modified()的属性名称。
  • SetModified():将状态设置为Modified()。
  • SetModifiedProperty():将指定的属性标记为Modified()。

4、ObjectStateManager

ObjectStateManager用于维护对象映射、对象状态/标识管理以及实体实例或关系实例的持久性。

  • GetObjectStateEntries:获取给定EntityState的ObjectStateEntry集合。
IEnumerable<ObjectStateEntry> oseList = ctx.ObjectStateManager.GetObjectStateEntries(EntityState.Added);
foreach (ObjectStateEntry ose in oseList)
{
    Console.WriteLine("{0},{1},{2},{3}", ose.State, ose.CurrentValues["ID"], ose.EntitySet.Name, ose.Entity);
}
  • GetObjectStateEntry:获取给定的EntityKey对应的ObjectStateEntry
myContext ctx = new myContext();
myTab r = ctx.myTab.First(p => p.ID == 1);
r.a = "wxwinter";
ObjectStateEntry ose = context.ObjectStateManager.GetObjectStateEntry(r.EntityKey);

Console.WriteLine(ose.State);
foreach (string pr in ose.GetModifiedProperties())
{
    Console.WriteLine(pr);
    Console.WriteLine("CurrentValues :{0}", ose.CurrentValues[pr]);
    Console.WriteLine("OriginalValues:{0}", ose.OriginalValues[pr]);
}

标签:02,Console,ObjectContext,对象,实体,ctx,Entity,ObjectStateManager,ose
来源: https://www.cnblogs.com/springsnow/p/13230069.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有