7

Tôi đang có đối tượng thực thể được gọi là Patient và pháp nhân này có tài sản là Visits thuộc loại VisitsCollection.Loại bộ sưu tập tùy chỉnh NHibernate

VisitsCollections là lớp con của IList<Visit> nhưng nó cũng thêm một số logic tùy chỉnh vào bộ sưu tập (như đặt hàng tự động, xác thực, thông báo, v.v.).

I cần để sử dụng loại bộ sưu tập tùy chỉnh vì nó thêm một số dữ liệu vào thực thể được thêm vào bộ sưu tập và thực hiện một số thủ tục giấy tờ khác một cách minh bạch.

Bây giờ tôi muốn để lập bản đồ mà trong NHibernate, vì vậy tôi đã tạo:

<list name="Visits" lazy="true" fetch="select"> 
    <key foreign-key="PatientId" /> 
    <index column="Timestamp" /> 
    <one-to-many class="Visit" not-found="ignore"/> 
</list> 

tôi nhận được một ngoại lệ:

Không thể cast đối tượng của loại 'NHibernate.Collection. PersistentList 'để nhập' ... VisitsCollection '

Bất cứ khi nào tôi truy cập thuộc tính lượt truy cập.

Tôi cũng đã cố gắng để ánh xạ nó theo cách này:

<list name="Visits" lazy="true" fetch="select" collection-type="VisitsCollection"> 
    <key foreign-key="PatientId" /> 
    <index column="Timestamp" /> 
    <one-to-many class="Visit" not-found="ignore"/> 
</list> 

nhưng vẫn còn, tôi nhận được ngoại lệ này:

Tuỳ loại không thực hiện UserCollectionType: ..... VisitsCollection

tôi không muốn kế thừa của tôi VisitsCollection từ bất kỳ loại NHibernate như lớp bộ sưu tập là một phần của một khuôn khổ mà tôi muốn nó được Dal-Agnos tic (vì nó sẽ được sử dụng trong nhiều tình huống - không chỉ với một cơ sở dữ liệu).

Bất kỳ ý tưởng nào về cách ánh xạ điều này, giữ gìn cấu trúc mã của tôi?

Xin cảm ơn trước.

Trả lời

6

Tôi không bao giờ sử dụng các loại bộ sưu tập tùy chỉnh, chủ yếu là vì tôi lười. NHibernate muốn bạn sử dụng một IUserCollectionType tôi tin rằng, đòi hỏi một chút đường ống dẫn nước.

Thay vì đó, điểm dừng đầu tiên của tôi là xem xét sử dụng các phương pháp mở rộng là discussed by Billly McCafferty. Nhưng bạn có mã được viết như vậy ...

Hoặc, bạn có thể ánh xạ bộ sưu tập của mình dưới dạng thành phần là discussed here by Colin Jack. Điều này có thể dễ dàng hơn cho kịch bản của bạn?

Đồng thời kiểm tra điều này SO thread.

1

Tôi cũng bỏ phiếu không sử dụng các bộ sưu tập tùy chỉnh. Dù sao, bạn có thể làm điều đó thông qua thành phần.

<component name="Warehouses" class="Core.Domain.Collections.EntitySet`1[Core.Domain.OrgStructure.IWarehouseEntity,Core],Core"> 
<set name="_internalCollection" table="`WAREHOUSE`" cascade="save-update" access="field" generic="true" lazy="true" > 
    <key column="`WarehouseOrgId`" foreign-key="FK_OrgWarehouse" /> 
    <!--This is used to set the type of the collection items--> 
    <one-to-many class="Domain.Model.OrgStructure.WarehouseEntity,Domain"/> 
</set> 

How to map NHibernate custom collection with fluentNHibernate?

0

Chỉ cần để tham khảo, đây là cách bạn có thể làm điều đó bằng FluentNHibernate

Dù chúng ta có nên hay không nên tạo ra một loại bộ sưu tập tùy chỉnh được một chủ đề riêng biệt IMHO

public class PatientOverride : IAutoMappingOverride<Patient> 
{ 
     public void Override(AutoMapping<Patient> mapping) 
     { 
      mapping.Component(
       x => x.Visits, 
       part => 
       { 
        part.HasMany(Reveal.Member<VisitsCollection, IEnumerable<Visit>>("backingFieldName")) // this is the backing field name for collection inside the VisitsCollection class 
        .KeyColumn("PatientId") 
        .Inverse(); // depends on your use case whether you need it or not 
       }); 
     } 
} 
Các vấn đề liên quan