2009-11-19 37 views
5

Tôi đã từng sử dụng L2S ​​và đang xem xét việc sử dụng NHib cùng với Kiến trúc Sharp trên một dự án. Tôi đã bắt đầu tạo mẫu và đi lên chống lại vấn đề đầu tiên mà tôi không có ý tưởng làm thế nào để google cho.NHỎ CÔNG POCO/Khái niệm cơ bản

Cho một POCO với một số tính chất đơn giản, và một tài sản tài liệu tham khảo (loại - lớp không được hiển thị ở đây):

public class Post 
{ 
    public Post() 
    { 
    this.DateCreated = DateTime.Now; 
    } 

    public virtual string Title {get;set;} 
    public virtual DateCreated {get;set;} 
    public virtual Category {get;set;} 
} 

này rất hữu ích nếu tôi muốn nói ra một bản tóm tắt của bài viết nào trong định dạng bảng - nếu tôi muốn một cột có tên "Danh mục" và tôi muốn hiển thị tiêu đề danh mục tôi có thể chỉ cần sử dụng Post.Category.Title.

Tuy nhiên người dùng tạo bài đăng mới (họ chọn danh mục từ danh sách thả xuống hoặc tương tự). Họ nhấp vào gửi và tôi mới tạo đối tượng Bài đăng. Tuy nhiên trước khi tôi có thể duy trì bài viết mới, tôi phải lấy một thể hiện của Category (theo id) để gán cho thuộc tính Category?

Làm cách nào để tận dụng tối đa cả hai thế giới? Nếu tôi cập nhật bài viết POCO, làm cho Danh mục là int, tôi đã làm cho nó đơn giản hơn để tạo ra các cá thể mới. Nhưng khó hơn đối với một số mã hiển thị mà bây giờ sẽ phải giải quyết tên danh mục được cung cấp cho Id?

Tôi cảm thấy tôi đang thiếu một số khái niệm cơ bản ở đây?

Tôi biết với LINQ to Sql đã đưa ra một lược đồ trong đó bảng Post có cột khóa số nguyên foriegn có tên CategoryId, sẽ tạo cho tôi cả cột bảng bên dưới (CategoryId) và EntitySet chứa hàng khóa ngoài.

Làm thế nào để đạt được điểm tương tự trong NHibernate? Cái này thường được quản lý như thế nào?

Cảm ơn

Trả lời

4

Thực thể được liên kết phải được ánh xạ dưới dạng thực thể - ví dụ: Category, không phải int CategoryId.

Khi bạn đang tạo Post mới, nếu bạn không có Category thực tế (và tại sao không? Nếu bạn chọn danh mục từ danh sách bạn đã tải chúng) nhưng chỉ có id của bạn có thể sử dụng một phương pháp Load() để có được một loại dụ dai dẳng cho id cho mà không thực sự đánh một cơ sở dữ liệu:

post.Category = (Category) sesssion.Load(typeof(Category), categoryId); 

Bạn cũng có thể sử dụng phiên bản generic:

post.Category = session.Load<Category>(categoryId); 
+0

@Justice - cảm ơn bạn đã chỉnh sửa – ChssPly76

+0

Cảm ơn bạn đã trả lời. Kịch bản này là web (asp.net mvc) và tôi đang cố gắng tránh tra cứu quá nhiều đối với Db khi đăng lại * chỉ * để tái cơ bản tra cứu hoặc dữ liệu tham chiếu để duy trì một thực thể có thể có nhiều liên kết thực thể. Phương thức tải có vẻ tuyệt vời (và tôi NÊN đã nghĩ về nó nhưng như một newbie tôi cần phải làm quen với NHib - cuốn sách đang trên đường đi). – 6footunder

1

Trong NHibernate, bạn sẽ sử dụng thuộc tính tham chiếu.

Sử dụng bản đồ thành thạo, nó trông giống như sau:

mapping.References(x => x.Category, "CategoryId").PropertyRef(x=>x.Id).Cascade.All(); 

trong XML, đó là khoảng

<many-to-one name="Category" column="category_id" class="YourNamespace.Category" cascade="all" property-ref="Id" /> 

Bạn có thể sử dụng not-found để chọn hành vi khi không có loại liên quan.

Về cơ bản, bạn muốn ngữ nghĩa của đối tượng danh mục, không phải ID, vì vậy bạn chỉ cần nói cho NHibernate cách chúng được liên kết.

+0

Sry, tha thứ cho sự chậm chạp của tôi ... PropertyRef có tác dụng gì? Tôi đã chỉ googled một lần nữa và fluentnhibernate propertyref không nạo vét lên mà trông hữu ích :-) – 6footunder

+0

Trong trường hợp này, nó tham chiếu tài sản Id của đối tượng thể loại, ràng buộc nó vào cột CategoryId trong bài viết. (Có lẽ tôi đã sử dụng category_id để phù hợp với ví dụ về ánh xạ xml của mình). – JasonTrue

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