我在我的解决方案中使用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生成器,我将非常感激。
谢谢你们!
答案 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,这真的让我疯狂。