2009-04-12 23 views
18

Tôi có một số loại thực thể mà tôi muốn tải xuống. Tuy nhiên, họ có một số lĩnh vực (lắp ráp) nội bộ mà họ phơi bày, nhưng không được sử dụng bên ngoài lớp đó. Các trường này là trình biên dịch được tạo (F #) và tôi không thể thay đổi chúng. Các ví dụ ngoại lệ là:Bỏ qua các trường công cộng/nội bộ cho proxy NHibernate

NHibernate.InvalidProxyTypeException: các loại sau đây có thể không được sử dụng như proxy: Mappings.MTest: trường id @ 47 không nên được công khai cũng không nội

tôi hiểu lý do tại sao NHibernate đang làm điều này, và làm thế nào có các lĩnh vực, nếu tôi truy cập chúng, sẽ mess lên các thuộc tính lười biếng tải của proxy được tạo ra. Tuy nhiên, kể từ khi tôi biết tôi sẽ không được sử dụng các lĩnh vực, tôi có thể ghi đè NHibernate bằng cách nào đó?

Có cách nào tôi có thể nói "bỏ qua trường này" không? Tôi đang sử dụng Fluent NHibernate, nếu điều đó làm cho nó dễ dàng hơn.

Chỉnh sửa: Tôi cũng nên lưu ý, tôi đang sử dụng NHibernate 2.1.0 Alpha 2.

Edit2: Các ý chính ở đây là tôi muốn giữ LazyLoading kích hoạt, có nghĩa là tôi phải sử dụng thế hệ ủy quyền . Vô hiệu hóa LazyLoading hoạt động (không có proxy), nhưng sorta đánh bại mục đích của một framework đẹp như NHibernate.

Trả lời

16

tôi tập hợp lại NHibernate (dễ dàng hơn nhận được nguồn và xây dựng lại) và loại bỏ các mã lỗi trên các lĩnh vực công cộng/nội bộ. LazyLoading có vẻ hoạt động tốt mà không cần kiểm tra. (Mặc dù, tôi mới để NHibernate và vì vậy có lẽ là kịch bản tôi không biết.)

Edit: Ah, có một bất động sản, "use_proxy_validator" rằng sẽ vô hiệu hóa tất cả các kiểm tra xác nhận. Đủ tốt.

Fluently.Configure() 
    .ExposeConfiguration(fun cfg -> 
     cfg.Properties.Add("use_proxy_validator", "false"))... 
+1

công trinh ! cho Spring.Net bạn có thể thêm điều này vào "HibernatedProperties" '' –

0

Bạn có thể muốn xem qua số this page cung cấp tổng quan về việc sử dụng F # với chế độ NHibernate thông thạo.

Chỉnh sửa Tôi vừa nhận thấy tên người dùng của bạn. Tôi có đúng là có lẽ nghĩ rằng đây là blog của bạn? Thật ngốc nghếch của tôi. Nó dường như để giải quyết vấn đề của bạn mặc dù, đặc biệt "Chúng tôi bắt đầu bằng cách vô hiệu hóa LazyLoad vì hầu hết các thuộc tính không phải là ảo, và NHibernate sẽ không xác nhận bản đồ. Thay vào đó, chúng tôi một cách rõ ràng LazyLoad những thứ, như tham khảo cửa hàng."? Có lẽ tôi chỉ hiểu lầm vấn đề.

+0

Đó chính là vấn đề. Bây giờ tôi đã tạo các thuộc tính ảo, nhưng không có cách nào làm cho các trường sao lưu riêng tư. Tôi không muốn vô hiệu hóa tải chậm, tôi muốn NHibernate t chỉ cần đưa lên với nó :). Tôi không thể thấy bất kỳ lý do kỹ thuật nào mà nó không hoạt động, ngoại trừ việc kiểm tra cẩn thận nó có. – MichaelGG

+0

Tôi đoán nó có nhiều hơn để làm với thực tế là các proxy thậm chí không thể được tạo ra ở nơi đầu tiên nếu có thành viên không ảo vì nó nhất thiết phải là một lớp con ghi đè tất cả các thành viên. Thật không may là tôi không đủ quen thuộc với F # để đưa ra lời khuyên cụ thể. –

+0

Họ có thể, họ chỉ không thể ghi đè lên các lĩnh vực của khóa học. Xem câu trả lời của tôi. – MichaelGG

1

Bạn có thể sử dụng thuộc tính

[XmlIgnore] 

để trang trí các lĩnh vực :)

+0

Dành cho NHibernate? Nó bỏ qua nó và vẫn bị rơi. – MichaelGG

+0

Lạ lùng: Tôi đã tự sử dụng nó cho cùng một loại vấn đề. Có lẽ đó là bởi vì bạn sử dụng FluentNHibernate .. – cwap

+0

Oh rằng sucks: (. Nó sẽ là một giải pháp dễ thương. (Mặc dù, tôi không thể thực sự đặt thuộc tính trên các lĩnh vực này) Bạn có tham chiếu đến bất kỳ tài liệu hiển thị những gì XmlIgnore điều khiển – MichaelGG

1

Bạn có thể sử dụng Giao diện để khai báo các trường "đã sử dụng" không? http://nhibernate.info/doc/nh/en/index.html#persistent-classes-poco-sealed

"Một khả năng khác là cho lớp để thực hiện một giao diện mà tuyên bố tất cả các thành viên cộng đồng"

Tôi không biết nếu NH sử dụng cùng một @transient chú thích/thuộc tính như phiên bản JAVA để bỏ qua một tài sản trong hoạt động liên tục.

+0

F # không có triển khai giao diện ngầm, và trường thực tế có tên trình biên dịch tạo ra. Nhưng tôi thích suy nghĩ. – MichaelGG

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