考虑以下代码: -
public T Save<T>(T instance) where T : class
{
using(ISession.BeginTransaction())
{
ISession.Save(instance);
ISession.Transaction.Commit();
ISession.Refresh(instance);
return instance;
}
}
NHibernate
如何使用新生成的ID
填充ID
属性,而不管数据库和数据类型如何?最初,我认为它必须使用类似的方式我们手动执行它,如@@Identity
,SCOPE_IDENTITY
用于MS SQL Server和相对查询其他数据库。但这不适用于GUID
等所有数据类型。
当我致电ISession.Refresh(instance);
时,我在instance
对象中获得了新插入的ID。这不是问题,只是想了解NHibernate
如何做到这一点。
答案 0 :(得分:0)
你到底想要什么?
您可以准确定义ID在映射中的工作方式。它与数据类型或数据库无关。例如,您不能拥有Oracle的身份生成器或非Guid ID的GuidComb。
以下是使用代码映射的示例
Id(x => x.Id, map =>
{
map.Column("Id");
map.Generator(Generators.GuidComb);
});
请参阅第{5.1.1.1节NHibernate documentation。发电机
答案 1 :(得分:0)
这取决于id生成器。每个generator都会采用不同的方式。
例如,如果你深入研究MsSql2000Dialect,你会发现这一行:
return "select SCOPE_IDENTITY()";
无论生成如何,您都不需要刷新对象以获取其ID。
因此,这段代码:
using(ISession.BeginTransaction())
{
ISession.Save(instance);
ISession.Transaction.Commit();
ISession.Refresh(instance);
return instance;
}
可能会成为:
using(ISession.BeginTransaction())
{
ISession.Save(instance);
ISession.Transaction.Commit();
return instance;
}
和instance
的ID不等于unsaved-value
。