用友u9-ubf应用开发手册内容摘要:

alData 是在查询后刷新,对于删除, OriginalData 没什么意义,取决于删除对象的加载方式,简单说,就是在 OnSetDefaultValue/ OnInserting/ OnInserted 中,新建对象的OriginalData 是一个 id 为 0 的空实体对象,在 OnSetDefaultValue/ OnUpdating / OnUpdated 中,修改对象的 OriginalData 是旧对象  为什么我访问某实体对象的 OriginalData 的属性为空 首先,看 OriginalData 对象的 ID,如果为 0,表示是一个空对象,所有的属性为默认值,请参考 OriginalData 刷新的时机判断这个访问操作是不是新建,这个对象是标准的查询出来的还是通过 CopyTo 的方式构造的(实体基类的 CopyTo 不涉及 OriginalData) 如果 OriginalData 有有效的 ID,检查这个对象的加载方式,看看是不是特殊的加载 方式引起属性为空  OriginalData 的关联对象 OriginalData 和 CopyTo 方法很类似,只完整实现了对基本属性的拷贝,对于关联实体,实际上是不拷贝的,这样,出现 的访问方式,对 bEntity,是懒加载上来的 实体的状态 SysState 实体的状态,为枚举对象,开发人员主要关心以下 4 个枚举值: Inserted, Updated, Deleted,Unchanged,分别对应实体的新建,修改,删除,不变化 (查询返回的初始状态 ) 是否需要持久 化 NeedPersistable NeedPersistable 表示这个对象是否需要持久化,如果为 false,则这个对象将不会参与持久化 Session 基本概念和使用方式 在现在 UBF 中, Session 的本意是 work unit,即持久层的一个边界,非常轻,主要用作批量提交,并标识这次批量提交的边界。 在 session 里面的 CUD 操作会受持久层控制,而 seesion外实体是不受控制的,所以,做 CUD 操作要在 session 里面完成,一般建议一个 BP 调用最好都有一个大 session 包住,这样,在里面的操作就 不用多次开 Session,性能会好些  关于事物, session 仅仅是一个持久层边界,不涉及到事务等概念,目前 UBF 的事物支持在 AOP 上定义,可以在 BP 上设置  当发生 session 嵌套的情况时,每次提交都是真正提交 using (ISession session1 = ()){ ... using (ISession session2 = ()){ ... ()。 //提交更改,但只是 Session2范围内的修改更新 } ()。 //提交更改,只处理 Session1的修改更新 }  当前 ISession 可以通过 Session 的 Current 属性获得,每调用一次 Session 的 Open 方法,Current 属性都会被更新  在一个 Session 范围内,可以分步提交, using(ISession session1 = ()){ Ass1to1 objA1 = ()。 ()。 //提交 objA1 的新建动作 Ass1to1 objA2 = ()。 ()。 //提交 objA2 的新建动作 } 对外接口  Create(IEntity entity) 将 entity 对象的状态设置为 ,并加入到当前的session 中  Modify(IEntity entity) 将 entity 对象的状态设置为 . Updated,并加入到当前的session 中  Remove(IEntity entity) 如果当前 session 有这个 entity,且状态为 insert,则从当前 session 中移出这个对象,其他情况下,将 entity 对象的状态设置为 . Deleted,并加入到当前的 session 中  InList(IEntity entity) 将 entity 加入到当前的 session 中 objA = ()。 = Test。 using (ISession s = ()) { (objA)。 ()。 } ((ID = 39。 + + 39。 ))。  DeList(IEntity entity) 将 entity 从 session 中移出 using (ISession s = ()) { objA = ()。 = 333。 (objA)。 ()。 } ((ID = 39。 + + 39。 ))。 实体的操作 增加实体  简单实体: 模型如下,对实体 A 操作  常规做法: 通常我们新建实体是要求在 session 里面建立: using (ISession session = ()) { obj = ()。 ... ()。 }  特殊做法: 遇到一些特殊情况,需要在 session 外面 new 一个对象时。 这种做法很特殊,需要显式在一进入 sesssion 时调用 (obj),不推荐 A_Ass1to1 obj = new A_Ass1to1()。 using (ISession session = ()) { //一进入 session,操作对象之前(包括设置实体的状态,赋值等所有的相关的操作之前) //要显示调用 (obj) (obj)。 = 111。 = aaa。 ()。 }  主从实体:  1 对 1,其中 A_Com1c1 为主实体, B_Com1c1 为非主实体,注意红字的写法 A_Com1c1 objA。 B_Com1c1 objB。 using (ISession session = ()) { objA = ()。 = 1000。 = objA。 objB = (objA)。 = 1001。 = objB。 ()。 }  1 对多: 其中 A_Com1cN 为主实体, B_Com1cN 为非主实体,注意红字的写法。 对于非主实体,有两种新建方式,这两种方式都只支持 A_Com1cN objA。 B_Com1cN objB。 using (ISession session = ()) { objA = ()。 = 111。 //方式一 objB = (objA)。 = 222。 objB = (objA)。 = 333。 //方式二 objB = ()。 = 444。 objB = ()。 = 555。 ()。 } 查询实体 (关于 OQL 和参数的用 法,见实体查询这个章节 )  查单个实体:下面的操作为查询一条ID为“111”的纪录 FindByID 方法是先从缓存里面取,缓存没有再去数据库取 , A_Com1cN obj = . FindByID(111)。 Find 方法是直接从数据库取 A_Com1cN objA = (ID = 111)。  查实体集合 FindAll 方法是直接从数据库取,参数为 OQL 语句 list = ()。 修改实体  简单实体  常规做法 通常我们修改实体是要求在 session 里面建立 using(ISession session = ()){ Customer obj = . FindByID(id)。 if(obj!=null){ = new name。 } ... ... ()。 }  特殊做法 遇到一些特殊情况,需要外面传进的实体 时,需要显式调用 session. Modify(obj),不推荐 using (ISession session = ()) { (obj)。 ()。 }  主从实体:  1 对 1  1 对多 using (ISession session = ()) { objA = (ID = 39。 + + 39。 , null)。 bList =。 bList[0].Name_B_Com1cN = aaa。 bList[1].Name_B_Com1cN = bbb。 ()。 } 删除实体  简单实体 using(ISession session = ()){ Customer obj = (id)。 if(obj!=null){ ()。 } ... ... ()。 }  主从实体: 删主实体会自动全部删除从实体 using (ISession session = ()) { objA = (ID = 39。 + + 39。 , null)。 //会自动删除 objA 及 objA 下所有的从实体 ()。 ()。 }  只删除从实体: 删除从实体有两种方式,一种是调用从实体的 (0),一种是调用 (b),这两种方式是等价的 using (ISession session = ()) { objA = (ID = 39。 + + 39。 , null)。 bList =。 B_Com1cN b = bList[2]。 (0)。 (b)。 ()。 }  Qamp。 A  对于一对多组合,我怎样知道删除的子对象 我们知道,对于一对多的情况,当我们对子对象调用 Remove 方法时,该对象会从当前的集合中移出,即子对象的集合存放的是有效的对象,是新建和修改的对象。 如果我们还需要访问删除的对象,可以从当前的 List 的属性 DelLists 中找到。  对一对多组合的子对象作集合 Clear 操作,怎么没有删除 需要注意,实体的删除动作只能用 Remove 方法, Clear 是集合本身的方法,不是持久层提供的删除自对象的方法 实体的查询 BE 的查询这块主要有 3 个查询类, EntityDataQuery, EntityQuery 和 EntityViewQuery,EntityDataQuery 主要用于希望返回。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。