2012-01-21 6 views
0

Я использую ActiveRecord от CastleProject с MySQL в своем решении. Я хотел бы получить последнюю вставку ID, так что я сделал что-то вроде этого:Как получить последний идентификатор вставки в Castle ActiveRecord?

[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); 
} 

Иногда он выдает правильный идентификатор, но иногда он просто выводит 0. ли я пропустить что-нибудь?

Примечание. Причина, по которой я это сделал, состоит в том, что у нас было несколько серверов, подключенных к одной базе данных одновременно, и мне нужен уникальный генератор идентификаторов. Для уникального я имею в виду уникальное среди этих серверов. Если есть другие решения для поддержки уникального генератора идентификаторов среди нескольких серверов, я буду очень благодарен.

Спасибо, ребята!

ответ

0

Если вы хотите иметь уникальный идентификатор среди нескольких серверов, вы можете использовать GUID вместо int. Если, однако, вы просто пытаетесь получить идентификатор элемента, который вы только что вставили, вы можете просто обновить его с помощью user.Refresh()

+0

Я попытался использовать 'user.Refresh()', однако я все равно получаю 0 для 'user.Id' иногда. –

0

Castel.ActiveRecord (или лучше NHibernate) предоставляет вам несколько вариантов генерации первичных ключей, вы должны взгляните на PrimaryKeyType-Enum.

GUID является самым простым, ему больше ничего не нужно, чтобы сделать первичный ключ-Свойство типа System.Guid и отрегулировать столбец в базе данных. (Я не уверен, какой тип вам нужен в базе данных, я всегда использую 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

0

Я был укушен одним и тем же вопросом. Тем не менее, моя проблема росла, и я нашел то, что кажется реальной проблемой; nHibernate не поддерживает поток. Я предполагаю, что ваш код многопоточен, поэтому вам нужно использовать «использование (новый SessionScope()) блоков для доступа к базе данных в других потоках.

В моем случае замок вернул идентификаторы из других таблиц после сохранения, что действительно сбило меня с ума.