2015-04-30 17 views
11

Tôi đang cố gắng ánh xạ một bộ sưu tập đối tượng giá trị, nơi chúng chứa các đối tượng giá trị khác nhưng tôi nhận được ngoại lệ bên dưới.Lập bản đồ một thành phần bên trong Bộ sưu tập thành phần

nHibernate Ngoại lệ:

----> NHibernate.PropertyNotFoundException : Could not find a getter for property '_timeAtAddress' in class 'CustomerAddress' 

Tên miền:

public class CustomerAddress 
{ 
    private TimePeriod _timeAtAddress; 

    protected CustomerAddress() { } 

    public CustomerAddress(TimePeriod timeAtAddress) 
    { 
     _timeAtAddress = timeAtAddress; 
    } 

    public TimePeriod TimeAtAddress { get { return _timeAtAddress; } } 
} 

public class TimePeriod 
{ 
    private readonly int _months; 
    private readonly int _years; 

    protected TimePeriod() { } 

    public TimePeriod(int months, int years) 
    { 
     _months = months; 
     _years = years; 
    } 

    public int Months { get { return _months; } } 
    public int Years { get { return _years; } } 
} 

nHibernate Mapping:

contact.HasMany<CustomerAddress>(Reveal.Member<Contact>("_customerAddresses")) 
    .Schema(...) 
    .Table(...) 
    .KeyColumn(...) 
    .AsBag() 
    .Not.LazyLoad() 
    .Component(address => 
    { 
     . 
     . 
     . 

     address.Component(Reveal.Member<CustomerAddress, TimePeriod>("_timeAtAddress"), timeAtAddress => 
     { 
      timeAtAddress.Map(Reveal.Member<TimePeriod>("_years")).Column("TIME_YEARS"); 
      timeAtAddress.Map(Reveal.Member<TimePeriod>("_months")).Column("TIME_MONTHS"); 
     }); 
    }); 

Đã có một q uick nhìn vào Access nhưng dường như không thể tìm ra nơi để thiết lập cho các thành phần. Bạn có thể giúp?

+0

Tại sao bạn thêm thành phần trong quan hệ HasMany? Bạn đã thử chỉ gọi một tham chiếu đến một Địa chỉ? – Najera

+0

Không chắc chắn nếu tôi làm theo, bạn sẽ thay đổi điều gì ở đó? –

+0

Im asuming bạn không cần phải sử dụng phương pháp 'Thành phần' trong mối quan hệ' HasMany', chỉ cần đoán bạn nên thêm chỉ tham chiếu địa chỉ. Chỉ cần cung cấp cho nó một thử. – Najera

Trả lời

1

Cách duy nhất tôi quản lý để tiến lên (sử dụng trường riêng) là đặt quy ước Access.Field chung.

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Customer>() .Conventions.Add(DefaultAccess.Field()))

3

Thay vì cấu hình FluentNHibernate để thiết lập các lĩnh vực tư nhân, nên không thể nói cho nó để sử dụng đối số nhà xây dựng?

cảm giác ruột của tôi là sai lầm là ở đây:

address.Component(Reveal.Member<CustomerAddress, TimePeriod>("_timeAtAddress") 

Trong trường hợp bạn đang nói cho nó để sử dụng trường _timeAtAddress.

+0

Bạn có thể hiển thị ví dụ lập bản đồ bằng cách sử dụng ctor không? –

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