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
Trả lời
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.
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
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]).
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.
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
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. –
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()
- 1. NHibernate: Sử dụng Fluent Nhibernate để lưu các đối tượng con
- 2. Xác minh ánh xạ nhibernate fluent nhibernate
- 3. Fluent nhibernate auto increment non key (Id) tài sản
- 4. Fluent NHibernate LazyLoad Issues
- 5. Nhận đối tượng theo id()?
- 6. Fluent NHibernate Visual Designer
- 7. Fluent NHibernate, làm việc với giao diện
- 8. Bản đồ chìa khóa nước ngoài trong Fluent NHibernate mà không có thuộc tính đối tượng
- 9. Symfony2: lấy id của đối tượng đã tồn tại
- 10. Fluent NHibernate, join-subclass mapping
- 11. Fluent Nhibernate left tham gia
- 12. Làm cách nào để lưu một đối tượng tạm thời đã tồn tại trong phiên NHibernate?
- 13. one-to-one fluent nhibernate?
- 14. NHibernate Nhận các đối tượng không có proxy
- 15. Fluent NHibernate HasManyToMany() Lập bản đồ
- 16. fluent nhibernate HasOne WithForeignKey không hoạt động
- 17. NHibernate - truy cập ID của một đối tượng liên quan mà không cần tải toàn bộ đối tượng
- 18. Restangular - Nhận đối tượng w/id, chỉnh sửa đối tượng, cập nhật đối tượng
- 19. Fluent NHibernate ánh xạ tham chiếu đến một cột không phải là cột ID
- 20. Fluent NHibernate FluentMappings.AddFromAssemblyOf <> Phát hành
- 21. Xem đối tượng phiên NHibernate
- 22. Id đối tượng JavaScript
- 23. Bản đồ NHibernate lưu loát
- 24. Fluent nHibernate Join đang thực hiện chèn vào bảng đã nối
- 25. jQuery: Nhận đối tượng trẻ em với ID cụ thể
- 26. "No persister for" lỗi với NHibernate, NHibernate.Linq và Fluent Mapping
- 27. NHibernate fluent HasMany ánh xạ chèn NULL Phím ngoài
- 28. đối tượng giá trị Null trong NHibernate
- 29. Ánh xạ bảng Fluent-NHibernate không có khóa chính
- 30. Lỗi trong Cascade: đối tượng đã xóa sẽ được lưu lại bởi thác
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? –
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 –
Nó chỉ là object.Id hoặc bất cứ trường id nào của bạn được gọi. –