2013-01-13 8 views
19

Dla tabeli, która ma tożsamość:Jak pobrać auto-incremented Id w ServiceStack OrmLite?

[AutoIncrement] 
    public int Id { get; set;} 

podczas wstawiania nowego wiersza do bazy danych, co jest najlepszym sposobem, aby pobrać identyfikator obiektu?

Na przykład:

db.Insert <> (new User());

Wartość identyfikatora wynosi 0 po wstawieniu, ale w bazie danych tak nie jest. Jedyna możliwość, którą mogę zobaczyć, to:

Id = (int)db.GetLastInsertId(); 

Jednak nie sądzę, że byłoby to bezpieczne wezwanie do zrobienia. Jeśli w tym samym czasie dzieje się 100 elementów, może zostać zwrócony identyfikator innej wkładki. W EF, gdy robisz wstawkę, identyfikator jest ustawiony dla ciebie.

Czy ktoś wie, jak najlepiej to zrobić?

Odpowiedz

26

W ServiceStack.OrmLite v4 które domyślnie za pomocą sparametryzowanych kwerend istnieje kilka opcji w db.Save() który automatycznie zapełnia autoIncrement ID, np:

db.Save(item); 
item.Id //populated with the auto-incremented id 

przeciwnym razie można wybrać za pomocą identyfikatora ostatni insert :

var itemId = db.Insert(item, selectIdentity:true); 

Oto more examples showcasing OrmLite's new API's.


Dla OrmLite v3

Prawidłowe połączenie jest db.GetLastInsertId() który SQL Server pod maską na przykład nazywa SELECT SCOPE_IDENTITY() który zwraca ostatni zapisany identyfikator dla tego związku.

Jest to bezpieczne, ponieważ wszystkie inne współbieżne wstawki, które mogą się zdarzyć, używają innych połączeń DB. Aby ktokolwiek mógł korzystać z tego samego połączenia, musi zostać zutylizowany i zwolniony z powrotem do puli.

+0

Och, więc za połączenie! Teraz ma to więcej sensu. – Dylan

+0

Dzięki za wyjaśnienie na v3! db.GetLastInsertId() wydaje się nie działać, ponieważ jest to metoda ukryta, jak sądzę .... jakiekolwiek wskazówki? – theoutlander

2

Powinieneś zdecydowanie używać wzorca Jednostki Pracy, szczególnie w tych scenariuszach, zawijasz kody powiązane z db w zakresie transakcji.

W ormLite można zaimplementować to poprzez IDbCommand i IDbTransaction (patrz przykład tutaj http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs)

Patrząc na kod, zauważysz, że będzie mniej magiczne i bardziej ręczne kodowanie, ale jest jeden sposób.

+0

Przeczytasz o Unit of Work i przyjrzysz się przykładowemu źródłu. – Dylan

2

Aktualizacja: Jak widać here, jeśli używasz ServiceStack/ORMLite v4, musisz użyć sparametryzowanej kwerendy, aby uzyskać wstawiony identyfikator. Na przykład:

var UserId = db.Insert<User>(new User(), selectIdentity: true); 
Powiązane problemy