gpt4 book ai didi

c# - 具有未保存的实体对象的 Nhibernate GetEntry

转载 作者:行者123 更新时间:2023-11-30 16:13:57 30 4
gpt4 key购买 nike

在保存实体之前,我想检查它是否脏。
所以我有实体对象从 ajax 返回。 (带身份证)。
该对象尚未保存,我想用它获取实体条目:

// this will return null, I assume it is because the object it not persisted yet.
session.GetSessionImplementation().PersistenceContext.GetEntry(entity);

// this will return what I want, but merge will save the object...
session.GetSessionImplementation().PersistenceContext.GetEntry(session.Merge(entity));

这不就是 dirty 和 un-dirty 背后的全部思想吗,在保存操作之前了解它们吗?在没有持久对象的情况下如何获取对象的条目?

更新
举一个现实生活中的用例,假设我有方法 NhiUtil.IsPropertyDirty,它在里面执行上面的 GetEntry

if(NhiUtil.IsPropertyDirty("Password",userEntityFromClient, session)){
userEntityFromClient = Hush(userEntityFromClient.Password);
}
session.SaveOrUpdate(userEntityFromClient);

如果我被迫在 IsPropertyDirty 中合并/保存 userEntityFromClient 以使 GetEntry 工作,我无法在之前做出业务逻辑决策实际保存...
所以整个 IsPropertyDirty 不可用...

谢谢

最佳答案

这就是我们拥有 NHiberante 的原因。如果您仔细阅读您的问题并阅读有关 ORM 的内容,您一定会发现这正是这些工具出现在此处的原因。这就是他们为我们所做的。

换句话说,执行标准步骤:

  • 1) 通过反序列化从客户端(上层/层)获取对象
  • 可选从 session.Get(id) 获取对象并绑定(bind)它,稍后跳过 Merge
  • 可选的做验证(业务层)
  • 2) 合并对象,session.Merge() 并调用 SaveOrUpdate()
  • 3) 刷新 session

太好了。 1) 如果我们首先从接收到的数据 (JSON) 中获取并绑定(bind)对象,我们已经在 ISession 中有了一个对象。 ISession 是为我们做脏检查的那个

在第 2 种情况下,我们已经分离了对象,使用 session.Merge() 它将再次为我们在 ISession 中完成所有工作。

同花顺,只有脏的

本质在3) Flushing。只有当对象变脏时,它才会被转换成 Update/Insert 语句。如果相同(未更改)...不调用数据库引擎

一些有趣的来源:

Chapter 24. Best Practices

In a three tiered architecture, consider using SaveOrUpdate().

When using a distributed architecture, you could pass persistent objects loaded in the middle tier to and from the user interface tier. Use a new session to service each request. Use ISession.Update() or ISession.SaveOrUpdate() to update the persistent state of an object.

9.4.2. Updating detached objects

... SaveOrUpdate() ...

... using Merge(Object o). This method copies the state of the given object onto the persistent object with the same identifier. If there is no persistent instance currently associated with the session, it will be loaded. The method returns the persistent instance. If the given instance is unsaved or does not exist in the database, NHibernate will save it and return it as a newly persistent instance. Otherwise, the given instance does not become associated with the session. In most applications with detached objects, you need both methods, SaveOrUpdate() and Merge().

也很有趣:Ayende - The difference between Get, Load and querying by id

还有 12.1. Interceptors ,它允许 Hook 某些事件,例如:

public override bool OnFlushDirty(object entity, 
object id,
object[] currentState,
object[] previousState,
string[] propertyNames,
IType[] types)

关于c# - 具有未保存的实体对象的 Nhibernate GetEntry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21080409/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com