2010-11-16 37 views
6

Tôi không thể tìm thấy câu trả lời cho vấn đề này vì vậy tôi cho rằng đó là điều tôi đang làm sai.Fluent NHibernate LazyLoad Issues

Tôi có một PersistenceModel thiết lập nơi mà tôi đã thiết lập một quy ước như sau: -

persistenceModel.Conventions.Add(DefaultLazy.Always()); 

Tuy nhiên, đối với một trong những mối quan hệ HasManyToMany thuộc một trong các đơn vị của tôi, tôi muốn háo hức tải sẽ diễn ra mà tôi thiết lập như sau: -

HasManyToMany(x => x.Affiliates).Not.LazyLoad(); 

trực giác, tôi mong đợi tải mong muốn xảy ra như tôi trọng mặc định tải lười biếng mà tôi đã xác định như một quy ước nhưng nó tải vẫn lười biếng. Nếu tôi đặt quy ước DefaultLazy để không bao giờ và sau đó đặt LazyLoad trên một mối quan hệ cá nhân thì nó cũng không hoạt động.

Bất kỳ ý tưởng nào?

Trả lời

9

Khi bạn đặt Not.LazyLoad(), bạn cho NHibernate tải Đại lý khi phụ huynh tải. NHibernate sẽ thực hiện việc này bằng cách thực hiện một lựa chọn khác trên bảng Liên kết nhiều đến nhiều bất kể bạn có truy cập bộ sưu tập của Chi nhánh hay không. NHibernate đang sử dụng một lựa chọn khác vì đó là chế độ tìm nạp mặc định. Bạn cũng muốn ghi đè chế độ tìm nạp, trong truy vấn hoặc trong ánh xạ. Để làm điều đó trong các bản đồ, thêm dòng sau:

HasManyToMany(x => x.Affiliates) 
    .Not.LazyLoad() 
    .Fetch.Join(); 

Bạn cũng có thể muốn bao gồm một ".Cascade.AllDeleteOrphan()" nếu bạn muốn NHibernate để tồn tại mới Affiliaites bổ sung vào bộ sưu tập và xóa những mồ côi. Nếu bạn không làm điều này, bạn sẽ phải gọi session.Save (newAffiliate) một cách rõ ràng. Nếu không, bạn sẽ nhận được TransientObjectException khi bộ sưu tập Chi nhánh của bạn chứa một Chi nhánh mới.

+0

Rất tiếc, tôi đã xóa các phần của mã mà tôi không nghĩ là có liên quan ở đây. Tôi cũng có .FetchType.Join() và tắt tải lười vẫn không hoạt động. Cách duy nhất để tắt tải chậm tôi đã thấy rằng công trình cho tôi là bằng cách thiết lập quy ước. – Dotnet

+0

Tôi đã thêm quy ước DefaultLazy.Always() và mối quan hệ HasManyToMany() được tải lên một cách chính xác khi Fetch.Join() được áp dụng. Bạn có thể lấy mẫu của tôi từ GitHub ở đây: https://github.com/JamesKovacs/JamesKovacs.StackOverflow/tree/master/FluentNhHacking/ –

+0

Được rồi, tôi bắt chước khá nhiều mã của bạn trong tình huống của tôi và nó vẫn không hoạt động, vì vậy tôi sẽ phải có một cái nhìn gần hơn. Tôi đang sử dụng .ShowSql() để xác định xem các truy vấn đã được chạy lazily hoặc háo hức mà tôi đoán là chính xác? – Dotnet

0

Nó có thể là một điều ngu ngốc để hỏi, nhưng bạn có thực hiện truy vấn bên trong phiên của bạn? Nói,

Using(var session = OpenSession()) 
{ 
    session.Query<Entity>().ToList(); 
} 

Tôi đã gặp vấn đề này trước và cuối cùng nhận ra các đối tượng mà tôi truy cập chưa được truy vấn trước khi xử lý phiên.

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