Как получить последний идентификатор вставки в замке ActiveRecord? - PullRequest
0 голосов
/ 21 января 2012

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

[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. Я что-то пропустил?

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

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

Ответы [ 3 ]

0 голосов
/ 22 января 2012

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

GUID является самым простым, не требующим ничего, кроме как для создания свойства первичного ключа типа System.Guid и настройки столбца в базе данных. (Я не уверен, какой тип вам нужен в базе данных, я всегда использую VARCHAR / CHAR / и т.д.)

Если вы хотите сохранить используемую в данный момент уинт, я бы предложил использовать 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 голосов
/ 27 января 2012

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

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

0 голосов
/ 22 января 2012

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

...