gpt4 book ai didi

nhibernate - 如何使用 NHibernate 插入或更新(或覆盖)记录?

转载 作者:行者123 更新时间:2023-12-04 01:01:48 24 4
gpt4 key购买 nike

无论它是否已经存在,我都需要向数据库写入一行。在使用 NHibernate 之前,这是通过存储过程完成的。该过程将尝试更新,如果没有修改任何行,它将回退到插入。这很有效,因为应用程序并不关心记录是否存在。

使用 NHibernate,我发现的解决方案需要加载实体并修改它,或者删除实体以便插入新实体。应用程序必须关心记录是否已经存在。有没有办法解决这个问题?

身份证重要吗?

分配的 ID

该对象有一个关键字作为分配的 id,并且是表中的主键。

我知道 SaveOrUpdate() 将根据 Id 适本地调用 Save() 或 Update() 方法。使用分配的 id,这将不起作用,因为 id 不是未保存的值。然而,版本或时间戳字段可以用作指示符。实际上,这并不相关,因为这仅反射(reflect)内存中的对象是否与数据库中的记录相关联;它不指示该记录是否存在于数据库中。

生成的 ID

如果分配的 id 确实是问题的原因,我可以使用生成的 id 而不是关键字作为主键。这将避免 NHibernate 插入/更新问题,因为它会有效地始终插入。但是,我仍然需要防止重复的关键字。使用关键字列上的唯一索引,即使主键不同,它仍然会为重复的关键字抛出异常。

另一种方法?

也许问题不在于 NHibernate,而在于建模的方式。与应用程序的其他领域不同,这更以数据为中心而非以对象为中心。 NHibernate 使读/写变得容易并消除了存储过程,这很好。但是不考虑现有值而简单地编写的愿望并不适合对象的身份模型模型。有没有更好的方法来解决这个问题?

最佳答案

我正在使用

    public IList<T> GetByExample<T>(T exampleInstance)
{
return _session.CreateCriteria(typeof(T))
.Add(Example.Create(exampleInstance))
.List<T>();
}

public void InsertOrUpdate<T>(T target)
{
ITransaction transaction = _session.BeginTransaction();
try
{
var res=GetByExample<T>(target);
if( res!=null && res.Count>0 )
_session.SaveOrUpdate(target);
else
_session.Save(target);
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
throw;
}
finally
{
transaction.Dispose();
}
}

但是 FindByExample 方法返回所有对象,而不是具有确切 ID 的对象,您有什么建议?因为我只有对象作为参数,所以我无权访问其特定的 ID 字段,所以我不能使用 session.get(Object.class(), id);

关于nhibernate - 如何使用 NHibernate 插入或更新(或覆盖)记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/325990/

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