2009-04-23 24 views
7

Làm thế nào tôi có thể lập bản đồ này:lập bản đồ bộ sưu tập tư nhân trong nhibernate thạo

public class Customer 
{ 
    private IList<Order> _orders; 
    public IEnumerable<Order> 
    GetAllOrders() 
    { 
     return _orders;  
    } 
} 

Trên trang dự án là một số mẫu nhưng không ai nói về tình trạng này. Có mẫu này:

// model 
public class Account 
{ 
    private IList<Customer> customers = new List<Customer>(); 

    public IList<Customer> Customers 
    { 
    get { return customers; } 
    } 
} 

// mapping 
HasMany(x => x.Customers) 
    .Access.AsCamelCaseField(); 

Nhưng nó giả định rằng Tài khoản có trường công khai Khách hàng và kịch bản đó khác với tôi. Tôi đã thử một số tùy chọn có thể nhưng không ai làm việc:

HasMany(x => Reveal.Propertie("_orders")) 

Private lĩnh vực hoạt động tốt trong lập bản đồ tài sản đơn giản nhưng bộ sưu tập bản đồ là khá khác nhau. Bất kỳ ý tưởng? Cảm ơn

Trả lời

24

Giải pháp dễ nhất là để lộ bộ sưu tập của bạn dưới dạng Đơn đặt hàng thuộc tính công khai thay vì phương thức GetAllOrders(). Sau đó, lập bản đồ của bạn là

HasMany(x => x.Orders) 
    .Access.AsCamelCaseField(Prefix.Underscore); 

và lớp học của bạn là

public class Customer 
{ 
    private IList<Order> _orders = new List<Order>(); 

    public IEnumerable<Order> Orders 
    { 
     get { return _orders; } 
    } 
} 

Nếu điều đó không làm việc cho bạn, nó có thể sử dụng map private properties Reveal lập bản đồ thành thạo NHibernate của.

Edited thêm: Vừa làm điều này, câu trả lời đúng là:

HasMany<Order>(Reveal.Property<Customer>("_orders")) etc. 

Bộ sưu tập phải được tiếp xúc như là một tài sản ảo được bảo vệ để cho phép proxy:

protected virtual IList<Order> _orders { get; set; } 

This answer đặt tôi trên đúng đường.

1

Cảm ơn. Giải pháp của bạn là tốt. Tuy nhiên, có thể có các tình huống (giả thuyết) khi bạn không muốn tiết lộ bộ sưu tập riêng của mình. Kịch bản ánh xạ này không được giải thích trong bài đăng được liên kết của bạn bởi vì có sự khác biệt giữa ánh xạ bản đồ đơn giản như descibed trong bài đăng và bản đồ thu thập đó. Nỗ lực của tôi để sử dụng HasMany (x => Reveal.Propertie ("_ orders")) không thành công do ngoại lệ được nêu ra.

+3

tình huống giả == YAGNI –

+1

Trong trường hợp đó, tôi nghĩ bạn có thể trưng ra collecti của bạn được bảo vệ thay vì công khai. –

1

Bạn có thể ánh xạ một bộ sưu tập hoàn toàn riêng tư sử dụng Reveal.Member(), nhưng nó có một giới hạn cụ thể và không rõ ràng: các Expression rằng HasMany() chấp nhận phải trả lại hoặc IEnumerable<TReferenced> hoặc object.

Đối với lớp học của bạn:

public class Customer 
{ 
    private IList<Order> _orders; 
    public IEnumerable<Order> GetAllOrders() 
    { 
     return _orders;  
    } 
} 

dòng sau sẽ cư _orders bộ sưu tập:

HasMany(Reveal.Member<Customer, IEnumerable<Order>>("_orders")); 
    //additional mapping behaviors 

Đối với đầy đủ - dòng sau đưa ra một lỗi biên dịch:

HasMany(Reveal.Member<Customer, IList<Order>>("_orders")); 
Các vấn đề liên quan