如何检索Castle ActiveRecord中的最后一个插入ID?

时间:2012-01-21 05:19:35

标签: mysql castle-activerecord

我在我的解决方案中使用CastleProject的ActiveRecord和MySQL。我想检索最后一个插入ID,所以我做了类似这样的事情:

[ActiveRecord]
public class UserDb : ActiveRecordBase<UserDb>
{
    [PrimaryKey]
    public uint Id { get; set; }

    [Property]
    public int OtherStuff { get; set; }
}

public void Blablabla()
{
    UserDb user = new UserDb();
    user.OtherStuff = 123;
    user.CreateAndFlush();

    Console.WriteLine( user.Id );
}

有时,它输出正确的ID,但有时,它只输出0。 我错过了什么吗?

注意:我这样做的原因是因为我们有几个服务器同时连接到同一个数据库,我想要一个唯一的id生成器。对于唯一,我的意思是这些服务器中的独特。如果有其他解决方案来维护多个服务器中的唯一ID生成器,我将非常感激。

谢谢你们!

3 个答案:

答案 0 :(得分:0)

如果要在多个服务器中拥有唯一ID,可以考虑使用GUID而不是int。但是,如果您只是想获取刚插入的项目的ID,则可以使用user.Refresh()

刷新它

答案 1 :(得分:0)

Castel.ActiveRecord(或更好的NHibernate)为您提供了多个生成主键的选项,您应该看一下PrimaryKeyType-Enum。

GUID是最简单的,只需要制作System.Guid类型的primary-key-Property并调整数据库中的列。 (我不确定你在数据库中需要哪种类型,我总是使用VARCHAR / CHAR /等。)

如果您想保留目前正在使用的uint,那么我建议您使用HiLo。

[PrimaryKey(Generator=PrimaryKeyType.HiLo)]
public virtual uint Id{get;set;}

在数据库中:

CREATE TABLE hibernate_unique_key( next_hi NUMERIC(18, 0) ); 
INSERT INTO hibernate_unique_key VALUES(1);
-- script from ms-sql-express, I am not sure if there is a difference for mysql

问候 Juy Juka

答案 2 :(得分:0)

我被同样的问题所困扰。但是,我的问题越来越多,我发现了什么似乎是真正的问题; nHibernate不是线程感知的。我假设您的代码是多线程的,如果是这样,您需要在其他线程中使用'using(new SessionScope())'块来进行数据库访问。

在我的情况下,Castle会在保存后从其他表中返回ID,这真的让我疯狂。