2013-01-13 26 views
19

Đối với một bảng mà có một bản sắc:Làm cách nào để truy xuất Id được tăng tự động trong ServiceStack OrmLite?

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

Khi chèn một hàng mới vào cơ sở dữ liệu, cách tốt nhất để lấy lại ID của đối tượng là gì?

Ví dụ:

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

Giá trị của Id là 0 sau khi chèn, nhưng trong cơ sở dữ liệu này rõ ràng không phải là trường hợp. Khả năng duy nhất tôi có thể thấy là:

Id = (int)db.GetLastInsertId(); 

Tuy nhiên tôi không tin đây sẽ là một lời gọi an toàn để thực hiện. Nếu có 100 lần chèn xảy ra cùng một lúc, một Id cho chèn khác có thể được trả lại. Trong EF khi bạn chèn một Id được đặt cho bạn.

Có ai biết cách tốt nhất để thực hiện việc này không?

Trả lời

26

Trong ServiceStack.OrmLite v4 mặc định là sử dụng các truy vấn tham số có một vài tùy chọn trong db.Save() tự động populates Id AutoIncrement, ví dụ:

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

Nếu không, bạn có thể chọn id chèn qua sử dụng :

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

Dưới đây là more examples showcasing OrmLite's new API's.


Đối OrmLite v3

Cuộc gọi đúng là db.GetLastInsertId() mà cho SQL Server dưới mui xe ví dụ gọi SELECT SCOPE_IDENTITY() mà trả về id chèn vào cuối cùng cho rằng kết nối.

Điều này là an toàn vì tất cả các chèn đồng thời khác có thể xảy ra đang sử dụng các kết nối DB khác nhau. Để cho bất kỳ ai khác sử dụng cùng một kết nối, nó cần phải được xử lý và phát hành trở lại vào hồ bơi.

+0

Ồ, vì vậy nó là kết nối! Bây giờ có ý nghĩa hơn nhiều. – Dylan

+0

Cảm ơn bạn đã làm rõ trên v3! db.GetLastInsertId() dường như không hoạt động vì nó là một phương thức ẩn mà tôi nghĩ .... bất kỳ con trỏ nào? – theoutlander

2

Bạn chắc chắn nên sử dụng mẫu Đơn vị công việc, đặc biệt trong trường hợp này, bạn quấn mã liên quan đến db trong phạm vi giao dịch.

Trong ormLite, bạn có thể thực hiện điều này thông qua IDbCommand và IDbTransaction (xem ví dụ ở đây http://code.google.com/p/servicestack/source/browse/trunk/Common/ServiceStack.OrmLite/ServiceStack.OrmLite.Tests/ShippersExample.cs)

Nhìn vào mã này, bạn sẽ nhận thấy nó sẽ được mã hóa ít huyền diệu và thủ công hơn, nhưng đó là một cách.

+0

Sẽ đọc về Đơn vị công việc và xem nguồn mẫu. – Dylan

2

Cập nhật: Như đã thấy here, nếu bạn đang sử dụng ServiceStack/ORMLite v4, bạn cần sử dụng truy vấn được tham số hóa để lấy ID được chèn. Ví dụ:

var UserId = db.Insert<User>(new User(), selectIdentity: true); 
Các vấn đề liên quan