2012-01-21 4 views
0

CastleProject의 ActiveRecord를 MySQL과 함께 사용하고 있습니다. 나는 마지막으로 삽입 ID를 검색하고 싶었다, 그래서 나는이 같은 짓 :Castle ActiveRecord에서 마지막 삽입 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

여러 서버 중에서 고유 한 ID를 원하면 int 대신 GUID를 사용하는 것이 좋습니다. 그러나 방금 삽입 한 항목의 ID를 얻으려는 경우 user.Refresh()

+0

나는'user.Refresh()'를 사용해 보았지만'user.Id'에 대해서도 여전히 0을 얻는다. –

0

Castel.ActiveRecord (또는 더 나은 NHibernate)를 사용하면 기본 키를 생성 할 수있는 여러 옵션이 제공됩니다. PrimaryKeyType-Enum을 살펴보십시오.

GUID는 System.Guid 유형의 primary-key-Property를 만들고 데이터베이스의 열을 조정하는 데 필요한 것 중 가장 쉬운 GUID입니다. (나는 데이터베이스에 필요한 유형이 확실치 않다. 항상 VARCHAR/CHAR/등을 사용한다.)

현재 사용하고있는 uint를 유지하려면 HiLo를 사용하는 것이 좋습니다. 데이터베이스에서

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

: 저도 같은 문제로 물린했습니다

0

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. 그러나 내 문제가 커지면서 실제 문제 인 것으로 나타났습니다. nHibernate는 쓰레드를 인식하지 못한다. 당신의 코드가 멀티 쓰레드라면, 다른 쓰레드에서 데이터베이스 액세스를 위해 '(새로운 SessionScope())'블록을 사용해야한다고 가정합니다.

내 경우 캐슬은 절약 한 후에 다른 테이블의 ID를 반환하므로 실제로 나를 미치게 만들었습니다.

관련 문제