2010-03-12 22 views
5

Ý tưởng hay là tạo phiên bản nhẹ hơn của Thực thể trong một số trường hợp chỉ vì lý do hiệu suất trỏ đến cùng một bảng nhưng với ít cột được ánh xạ. Ví dụ: Nếu tôi có Bảng Liên hệ có 50 Cột và trong một số thực thể có liên quan, tôi có thể quan tâm đến thuộc tính FirstName và LastName là một ý tưởng hay để tạo một phiên bản nhẹ của bảng Liên hệ. Ví dụ.Sử dụng Phiên bản thực thể Lite trong Quan hệ nHibernate?

public class ContactLite 
{ 
    public int Id {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 

} 

Cũng có thể ánh xạ nhiều lớp vào cùng một bảng?

Trả lời

4

Không phải là ý hay. Thay vào đó, hãy luôn vẽ bản đồ lớp đầy đủ và tạo các lớp nhỏ hơn mà bạn có thể chiếu bằng cách sử dụng Transformers.AliasToBean hoặc LINQ.

Một ví dụ về sau này:

var lightContacts = (from contact in session.Linq<Contact>() 
        where contact.Country = "Argentina" 
        select new LightContact 
          { 
           Id = contact.Id 
           FirstName = contact.FirstName, 
           LastName = contact.LastName 
          }) 
        .ToList(); 

này sẽ chỉ chọn những ba lĩnh vực từ DB, ngay cả khi lọc bởi một chương trình khác.

Cần lưu ý rằng, với LINQ, bạn cũng có thể sử dụng loại ẩn danh để chọn bất kỳ phép chiếu nào bạn muốn mà không tạo thêm các loại hoặc ánh xạ.

+0

Tôi muốn sử dụng chủ yếu cho Quan hệ. Nếu tôi có mối quan hệ Nhiều-2-Một thì tôi không muốn nó tải 50 Cột. – Amitabh

+0

Vẫn vậy. Theo mặc định, nhiều người được tải dưới dạng proxy bằng khóa chính và chúng sẽ không được tải nếu bạn loại trừ chúng như trên. –

+0

Thật không may tôi đang trên nHibernate 1,2 với WCF và tải Lazy không phải là một lựa chọn với tôi. Vì vậy, tất cả mọi thứ là háo hức lấy. – Amitabh

5

Không ánh xạ nhiều lớp vào cùng một bảng. Tôi đã thử điều này một lần và mặc dù nó đã làm việc cho những gì tôi đã làm, tôi chắc chắn nó sẽ cắn tôi sau này. Tốt hơn là sử dụng các phép chiếu để đưa vào các lớp "ánh sáng".

1

Tôi đã sử dụng phương pháp này để xử lý Thực thể không có trường BLOB (chỉ để xử lý quan hệ v.v.).

tôi đã có một số vấn đề liên quan đến đa hình Implicit, có nghĩa là tôi đã thiết lập này:

public class ImageWithData: Hình ảnh

Việc thừa kế làm NHibernate tải một ImageWithData trong một khứ hồi thứ hai mỗi khi tôi giải quyết một hình ảnh trực tiếp (không phải khi liên quan với BelongsTo hoặc HasMany).

Có một tùy chọn trong NHibernate để tắt hành vi này, được gọi là đa hình = "rõ ràng" mà bạn chỉ định trên lớp cơ sở của bạn (trong trường hợp của tôi là Hình ảnh).

Nếu nó sẽ là thiết kế xấu trong trường hợp của bạn, tôi không biết, tất cả phụ thuộc vào lý do tại sao bạn cần phải làm sáng các thực thể của bạn.

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