2008-10-20 30 views
8

Tôi muốn biết nếu có một cách để vô hiệu hóa tự động tải hồ sơ trẻ em trong nHibernate (cho một: nhiều mối quan hệ).nhibernate - vô hiệu hóa tự động lazy tải hồ sơ trẻ em cho một đến nhiều relationsihps

Chúng tôi có thể dễ dàng tắt tải chậm trên thuộc tính nhưng những gì tôi muốn là vô hiệu hóa bất kỳ loại tải tự động (lười biếng và không lười biếng cả hai). Tôi chỉ muốn tải dữ liệu qua truy vấn (nghĩa là HQL hoặc Tiêu chí)

Tôi vẫn muốn xác định mối quan hệ giữa các bản ghi con cha trong tệp ánh xạ để tạo điều kiện HQL và có thể tham gia thực thể con, nhưng tôi không muốn các bản ghi con được tải như là một phần của bản ghi gốc trừ khi một truy vấn trên bản ghi phụ huynh tuyên bố rõ ràng rằng (thông qua tìm nạp háo hức, v.v.).

Ví dụ: Tìm nạp bản ghi Bộ từ cơ sở dữ liệu sẽ không tìm nạp tất cả các bản ghi nhân viên từ cơ sở dữ liệu vì nó có thể không bao giờ cần thiết.

Một tùy chọn ở đây là đặt bộ sưu tập Nhân viên trên Sở là tải chậm. Vấn đề với cách tiếp cận này là khi đối tượng được cung cấp cho API gọi nó có thể 'chạm' thuộc tính tải lười và sẽ lấy toàn bộ danh sách từ db.

Tôi đã cố gắng sử dụng 'gỡ bỏ' - để ngắt kết nối đối tượng nhưng dường như nó không hoạt động vào mọi lúc và không thực hiện lệnh trục xuất sâu trên đối tượng. Plus nó tóm tắt loại thuộc tính được tải lười biếng với lớp proxy đóng vai trò tàn phá sau này trong mã mà chúng tôi đang cố gắng hoạt động trên đối tượng thông qua sự phản chiếu và nó gặp loại chưa được mở rộng trên đối tượng.

Tôi là người mới bắt đầu đến nHibernate, bất kỳ gợi ý hoặc trợ giúp nào cũng sẽ hữu ích.

+0

Bạn có một typo: disbale -> vô hiệu hóa – Anthony

Trả lời

3

Với yêu cầu của bạn, bạn có thể chỉ đơn giản là không ánh xạ từ Cục đến Nhân viên, cũng như không có tài sản Nhân viên trong phòng của bạn. Điều này có nghĩa là bạn luôn luôn phải thực hiện một cơ sở dữ liệu để tìm nhân viên của cơ sở dữ liệu.

Aplogies nếu những ví dụ mã không làm việc ra khỏi hộp, tôi không gần một trình biên dịch tại thời điểm này

Vì vậy, lớp bộ phận của bạn có thể trông giống như:

public class Department 
{ 
    public int Id { get; protected set; } 
    public string Name { get; set; } 
    /* Equality and GetHashCode here */ 
} 

và Nhân viên của bạn sẽ trông giống như:

public class Employee 
{ 
    public int Id { get; protected set; } 
    public Name Name { get; set; } 
    public Department Department { get; set; } 
    /* Equality and GetHashCode here */ 
} 

Bất cứ khi nào bạn muốn tìm Nhân viên cho một bộ phận, bạn phải gọi:

/*...*/ 
session.CreateCriteria(typeof(Employee)) 
    .Add(Restrictions.Eq("Department", department) 
    .List<Employee>(); 

Đơn giản vì thông số của bạn cho biết "Các phòng có nhiều nhân viên", không có nghĩa là bạn phải lập bản đồ dưới dạng liên kết hai chiều. Nếu bạn có thể giữ liên kết một hướng, bạn thực sự có thể truy cập dữ liệu của bạn để bay.

Google "Domain Driven Design" Aggregate, hoặc xem trang 125 của cuốn sách Eric Evan về Domain Driven Design để biết thêm thông tin

-1

Bạn có thể có thuộc tính lười trên bộ sưu tập. Trong ví dụ của bạn, Bộ có n nhân viên, nếu người lười biếng được bật, nhân viên sẽ không được tải theo mặc định khi bạn tải bộ phận: http://www.nhforge.org/doc/nh/en/#collections-lazy

Bạn có thể truy vấn rõ ràng bộ phận VÀ nhân viên cùng nhau. Đó là tùy chọn "tìm nạp": http://www.nhforge.org/doc/nh/en/#performance-fetching-lazy

+0

Trong trường hợp khi truy vấn không muốn lấy người lao động ở tất cả các -the vấn đề là nhân viên vô tình nhận được lười biếng nạp nếu api gọi truy cập getter. Nó có thể là một hiệu suất kéo và nếu có một cách để chuyển đổi này đi. Trong bài viết của tôi, tôi đã đề cập đến một số vấn đề tôi phải đối mặt trong khi đuổi đối tượng – dotnetcoder

Các vấn đề liên quan