2010-02-11 24 views
5

Tôi đang sử dụng Fluent NHibernate trong ứng dụng Asp.net MVC. Tôi đã thiết lập để bắt đầu phiên và giao dịch theo mọi yêu cầu và cam kết giao dịch vào cuối yêu cầu. Tuy nhiên, những gì tôi muốn làm là lưu một đối tượng (trong trường hợp này là "Công ty" mới) và sau đó chuyển hướng đến trang chi tiết mới của Công ty đó. Làm thế nào để tôi có được Id của công ty mới để tôi có thể chuyển hướng? Nếu tôi nhận được Id sau phiên. Lưu (công ty), nó là null. Điều này có ý nghĩa vì nó chưa được cam kết, tuy nhiên, nó vẫn có vẻ như có một cách tương đối dễ dàng để làm điều này mà không cam kết giao dịch hiện tại và bắt đầu một giao dịch mới.Fluent NHibernate nhận Id của đối tượng đã lưu

+1

Bạn sẽ có thể nhận được id sau khi bạn đã gọi session.save. Bạn đang sử dụng loại id nào? –

+0

Hướng dẫn hoặc mã bạn sử dụng để nhận giá trị ID hàng mới là gì? Tôi đang lưu các hàng trong một bảng với một trường nhận dạng, nhưng chỉ bắt đầu với nHibernate. Kính trọng –

+0

Nó chỉ là object.Id hoặc bất cứ trường id nào của bạn được gọi. –

Trả lời

2

OK, sự cố ở nơi khác trong mã của tôi. Bạn có thể lấy Id ngay lập tức sau khi lưu, ngay cả khi bạn chưa thực hiện giao dịch hoặc xóa nó.

Cảm ơn tất cả mọi người vì câu trả lời, nhưng tiếc là không ai trong số họ là hoàn toàn chính xác.

0

Có thể nó không được đặt là tự động phát trong cơ sở dữ liệu? Như Mattias Jakobsson nói, id nên được giải quyết sau Session.Save

0

Vì đó là một giao dịch NHibernate hoãn thay đổi và do đó INSERT không được gửi đến cơ sở dữ liệu - và ID không được tạo ra bởi cơ sở dữ liệu. Do Session.Flush() - điều này sẽ không dừng giao dịch nhưng các thay đổi của bạn (INSERT) sẽ được thực thi. Hoặc sử dụng ID được chỉ định. Hoặc không phải lúc nào cũng bắt đầu các giao dịch - thực hiện điều này một cách rõ ràng (ví dụ như kiến ​​trúc S # arp Architecture với thuộc tính [Transaction]).

0

Tôi nghĩ rằng bạn nên bắt đầu một giao dịch cho mỗi phiên. Tôi đang sử dụng phiên mỗi yêu cầu và tôi bắt đầu và cam kết một giao dịch trong Session_EndRequest. Tuy nhiên, tôi thường có một giao dịch trên trang để tôi có thể xử lý bất kỳ lỗi nào xảy ra ở đó - bởi thời gian EndRequest xảy ra quá muộn để làm bất cứ điều gì nhưng trình bày một thông báo lỗi chung.

Nếu bạn đang sử dụng ID được tạo bởi cơ sở dữ liệu (nhận dạng) thì bạn sẽ phải xóa phiên để tạo ID.

+0

Bạn nên sử dụng một giao dịch cho mỗi phiên, thậm chí đọc. Nếu không, bạn sẽ không hoàn toàn sử dụng bộ nhớ cache - xem: http://ayende.com/Blog/archive/2008/12/28/nh-prof-alerts-use-of-implicit-transactions-is-discouraged.aspx – UpTheCreek

+0

Tôi đồng ý, trừ khi bạn có nghĩa là một giao dịch mỗi phiên. Câu trả lời của tôi có thể đã được rõ ràng hơn, nhưng tôi đã tranh luận chống lại cho phép đời giao dịch bằng với tuổi thọ yêu cầu. Không có vấn đề gì khi có nhiều giao dịch mỗi phiên. –

7

NHibernate tạo id khi session.Save() hoặc session.SaveOrUpdate() được gọi với một thực thể thoáng qua. Tại thời điểm này, thuộc tính id của thực thể được đặt và có thể được sử dụng.

Nếu trình tạo id yêu cầu quyền truy cập cơ sở dữ liệu, nó sẽ xảy ra tại thời điểm này. Vì vậy, đối với bộ tạo danh tính, chèn sẽ được thực hiện tại thời điểm này cũng như bất kỳ chèn nào đang chờ xử lý.

Nếu không, chèn đang chờ cho đến khi phiên là đỏ ửng đó sẽ xảy ra:

  • từ một số lời gọi của Find() hoặc Enumerable()
  • từ NHibernate.ITransaction.Commit()
  • từ ISession.Flush()
Các vấn đề liên quan