NHibernate如何在实体中更新新插入的ID?

时间:2016-11-22 14:05:49

标签: c# nhibernate

考虑以下代码: -

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属性,而不管数据库和数据类型如何?最初,我认为它必须使用类似的方式我们手动执行它,如@@IdentitySCOPE_IDENTITY用于MS SQL Server和相对查询其他数据库。但这不适用于GUID等所有数据类型。

当我致电ISession.Refresh(instance);时,我在instance对象中获得了新插入的ID。这不是问题,只是想了解NHibernate如何做到这一点。

2 个答案:

答案 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