2012-08-01 41 views
7

Tôi gặp sự cố khi tải bộ sưu tập. Thiết lập tôi có liên kết một-nhiều, đơn giản, được ánh xạ bằng FluentNHibernate. Pháp nhân được tải ngoại lệ thô lỗ bị ném nhưng truy cập vào bộ sưu tập có liên quan hiển thị "truy cập bất hợp pháp để tải bộ sưu tập". Tôi sẽ dán một phần có liên quan của mã ở đây.Tải bộ sưu tập NHibernate, "truy cập bất hợp pháp để tải bộ sưu tập"

[Serializable] 
[DataContract(IsReference = true)] 
public partial class Department : Entity 
{ 
    ... 
    [DataMember] 
    public virtual IList<PressJobRun> PressJobRun 
    { 
     get { return pressJobRunField; } 
     protected set { pressJobRunField = value; } 
    } 
    ... 
} 

ánh xạ như sau

public DepartmentMap() 
{ 
    Id(x => x.Id); 
    Map(x => x.Name) 
     .Not.Nullable() 
     .Length(100); 
    HasMany(x => x.PressJobRun) 
     .AsBag() 
     .Inverse() 
     .Cascade.AllDeleteOrphan() 
     .LazyLoad() 
     .BatchSize(50); 
    ... 
} 

Tôi cũng đã cố gắng để vô hiệu hóa tải lười biếng, bằng cách loại trừ các dòng và bằng cách gọi .Not.LazyLoad(), tuy nhiên kết thúc là như nhau.

using (var tx = m_Repository.Session.BeginTransaction()) 
    { 
     var depts = m_Repository.Session.CreateCriteria<Department>().List<Department>(); 
     var dept = depts[0]; 
     ... 
    } 

Tôi nhận thấy việc hiển thị phiên không phải là điều cần làm, nhưng đây là nỗ lực để đảm bảo phiên đó đang mở.

Khi tôi đi sâu ngoại trừ tôi thấy sau stack trace:

at NHibernate.Collection.AbstractPersistentCollection.Initialize(Boolean writing) 
    at NHibernate.Collection.AbstractPersistentCollection.Read() 
    at NHibernate.Collection.AbstractPersistentCollection.ReadSize() 
    at NHibernate.Collection.PersistentBag.get_Count() 
    at NHibernate.DebugHelpers.CollectionProxy`1.get_Items() 

Các Gremlin thú vị đến đây. Tôi đã đặt điểm ngắt trên dòng thiết lập của thuộc tính PressJobRun.

  • nếu tôi bước qua nó và nhanh chóng đồng hồ pressJobRunField, tôi thấy "truy cập bất hợp pháp để tải ngoại lệ".
  • nếu tôi xem nhanh lần đầu tiên value biến, tôi thấy bộ sưu tập đã tải. Bước qua dòng setter hoạt động như mong đợi.

gì tôi sử dụng

  • Visual Studio 2012, nhắm mục tiêu NET 4
  • NHibernate 3.3.1.400
  • SQL CE 4
  • Castle
  • Castle AutoTx facitlity
  • Tôi quản lý phiên p er WCF yêu cầu bản thân mình

Những gì tôi đã cố gắng

  • vô hiệu hóa lười biếng tải
  • chắc phiên mở cửa, và rằng đó là cùng một phiên trong thực hiện các mã vi phạm
  • toggled Inverted bản đồ bộ sưu tập (nghĩ rằng tôi tin rằng nó nên được đảo ngược)
  • giải pháp làm sạch và xây dựng lại
  • đảm bảo trong Trình quản lý cấu hình rằng tất cả các dự án trong giải pháp đang được xây dựng
  • đặt trình gỡ lỗi để phá vỡ tất cả các ngoại lệ được ném.Debugger không phá vỡ với ngoại lệ mà tôi nhìn thấy trong bộ sưu tập thiết

Trả lời

3

Vấn đề là khi PressJobRub.Department tài sản được thiết lập, mã của tôi cũng cho biết thêm các PressJobRun vào bộ sưu tập thích hợp trong Department. Tôi đã khởi tạo bộ sưu tập, nhưng vấn đề là bộ sưu tập mà NHibernate sử dụng không thành công vì một số lý do khi gọi phương thức Contains(). Tôi vẫn còn thắc mắc về gremlin mà tôi đã mô tả trong câu hỏi, và tại sao trình gỡ lỗi không phá vỡ ngoại lệ khi tôi không khai báo 'Chỉ bật gỡ lỗi mã của tôi' và đặt nó thành break on Thrown ngoại lệ.

Nhưng dù sao, giải pháp là để ánh xạ PressJobRun.Department quyền truy cập vào trường (trong trường hợp của tôi là Access.PascalCaseField(Prefix.mUnderscore)) để tránh cuộc gọi thêm thực thể vào bộ sưu tập Department.PressJobRun.

Krzysztof Kozmic's article giải thích điều này, mặc dù trong bộ sưu tập trường hợp của tôi chưa được khởi tạo.

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