2010-10-25 14 views
6

Tôi đang sử dụng Nhibernate thông thạo. Mã này Tải một thể hiện kiểu T từ DB dựa trên ID của nó.Nhược điểm GetById trả về ObjectNotFoundException insetad của null

public T GetById(IdT id, bool shouldLock) 
    { 
     T entity; 

     if (shouldLock) 
     { 
      entity = (T) NHibernateSession.Load(persitentType, id, LockMode.Upgrade); 
     } 
     else 
     { 
      entity = (T) NHibernateSession.Load(persitentType, id); 
     } 

     return entity; 
    } 

Nhưng tôi có vấn đề lớn. Khi tôi gọi tài sản trên đó, tôi nhận được ObjectNotFoundException thay vì null.

Làm cách nào để làm cho thực thể đó có thể bị vô hiệu và không trả lại Ngoại lệ?

Trả lời

12

Tôi sẽ sử dụng Lấy thay vì Tải. Nhận sẽ trả về null, thay vì một ngoại lệ.

+0

-1. Kiểu thực thể là nullable, nó rất có thể là một kiểu tham chiếu. – Aliostad

+1

Bất kể, giải pháp cho vấn đề là sử dụng Nhận, thay vì cố gắng tải xuống ... –

+2

+1 đây là câu trả lời đúng chỉ thiếu lời giải thích mà tôi đã đưa ra với tôi. –

9

Tôi nghĩ bạn đã nhầm lẫn với những gì Load thực hiện. Điều này tạo ra một đối tượng proxy NHibernate cho bạn bằng ID mà không thực sự truy vấn cơ sở dữ liệu.

Khi bạn gọi thuộc tính, nó sẽ truy vấn cơ sở dữ liệu, nếu bạn cung cấp id xấu thì không có đối tượng bên dưới nào ngoại trừ.

Các situtations bình thường bạn sẽ sử dụng điều này là để nói là bạn có một đối tượng State và người dùng đã chọn PA trong danh sách thả xuống. Thay vì phải truy vấn cơ sở dữ liệu cho đối tượng State vì bạn đã có khóa PA, bạn có thể gọi Load và sau đó chuyển đối tượng trạng thái đó vào một đối tượng khác để có mối quan hệ chính xác của Object X với State PA.

Phương pháp bạn muốn được sử dụng cho các đối tượng get chung hoặc nhận được null nếu chìa khóa không tồn tại chỉ là Session.Get<T>(object ID)

4

Load sẽ không bao giờ trở về null. Nó sẽ luôn trả về một thực thể hoặc ném một ngoại lệ. Nếu bạn muốn hành vi đó sử dụng Get. Thông tin thêm về điều này Difference between Get and Load