2012-01-24 26 views
8

Dưới đây là tình hình của tôi ..
Giả sử bạn có các đối tượng mô hình sau đây, đại diện cho bảng duy nhất trên riêng của họ:

Phim [Movie_Id, Tiêu đề, Đánh giá, ..]
diễn viên [Actor_Id, FirstName, LastName, ..]
Giám đốc [Director_Id, FirstName, LastName, ..]

Và một thực thể/table gọi là "Đề xuất", mà lại giới thiệu các đề xuất giữa những người dùng trong một trang web. Ý tưởng là đề xuất có thể thuộc bất kỳ loại nào, nghĩa là ai đó giới thiệu một diễn viên hoặc người nào đó đề xuất một bộ phim. Về cơ bản, bảng nên tìm một cái gì đó như thế này:

Khuyến nghị [Recommendation_Id, object_id, object_type, ..]

Và đây là những gì tôi đang mắc kẹt vào. Làm thế nào tôi có thể lập bản đồ các mối quan hệ này trong nHibernate với Fluent? Ý tôi là .. trong khi ánh xạ, tôi không thể chỉ định Loại (có liên quan đến bảng) do nguyên nhân được xác định trong thời gian chạy, nhưng tôi không thể chỉ dựa vào Id do chính nó không thể ngụ ý bảng nào thuộc về .
Ví dụ, hãy tưởng tượng kỷ lục này trên bàn nghị:

Recommendation_Id - object_id - object_type
83001--401--- "M"

Về cơ bản tôi đang lưu trữ một định danh char (trong trường hợp này " M "là viết tắt của bảng" Phim ") để biết bảng nào thuộc đối tượng Object_Id. Tôi không thể chỉ lưu trữ Object_Id mà không có Object_Type ..
Mapping để nhiều bảng với thành thạo NHibernate

Như ý kiến ​​cuối cùng, tôi muốn thêm rằng tôi đã nhìn thấy tất cả bảng mỗi lớp, bảng mỗi phân lớp, bảng mỗi lớp cụ thể ví dụ, nhưng tôi tin rằng không ai trong số này phù hợp trong tình huống này, như Movies_Id, Actors_Id, Directors_Id, ... đều khác nhau giữa chúng, như vậy là Recommendations_Id. Ý tôi là, không có thừa kế lớp con cơ sở ở đây, họ không chia sẻ Id của tất cả ..

Tôi hy vọng tôi làm cho bản thân mình rõ ràng. Cảm ơn trước.

+0

Cần lưu ý rằng thông thạo nHibernate hiện không hỗ trợ nhiều tùy chọn mà tôi cho là sẽ thực hiện. Trừ khi tôi sai, hãy lưu đề xuất khi bạn cập nhật phim sẽ không xảy ra liền mạch.Câu trả lời của Daniel gần hơn với bất cứ điều gì khác tôi có thể tìm thấy tho; o) – JasonCoder

+0

Nếu bạn muốn ánh xạ phía bên kia của mối quan hệ 'any', như trong' Movie.Recommendations', tôi tin rằng bạn có thể làm điều này với một ' -to-many' và thuộc tính 'where =" Object_Type = 'M' "' trên bộ sưu tập mà bạn có thể làm với Fluent NHibernate. –

Trả lời

11

Ánh xạ NHibernate bạn đang tìm kiếm là <any/>. Dưới đây là một vài nguồn lực để giúp bạn có được tốc độ với điều này NHibernate tính năng lập bản đồ:

Tôi tin rằng * .hbm.xml hai người là bạn chụp cho một cái gì đó như thế này:

<class name="Recommendation" table="Recommendations"> 
    <id name="Id"> 
    <column name="Recommendation_Id" /> 
    <generator class="native"/> 
    </id> 

    <any name="RecommendedObject" id-type="System.Int32" meta-type="System.String"> 
    <meta-value value="M" class="Movie"/> 
    <meta-value value="A" class="Actor"/> 
    <meta-value value="D" class="Director"/> 
    <column name="Object_Type"/> 
    <column name="Object_Id"/> 
    </any> 

    <!-- other stuff ... --> 
</class> 

Bạn sẽ có thể thực hiện điều đó với Fluent NHibernate như vậy trong bản đồ của Đề xuất:

ReferencesAny(x => x.RecommendedObject) 
    .IdentityType<int>() 
    .EntityTypeColumn("Object_Type") 
    .EntityIdentifierColumn("Object_Id") 
    .AddMetaValue<Movie>("M") 
    .AddMetaValue<Actor>("A") 
    .AddMetaValue<Director>("D"); 
+0

THANKS A LOT !!!! Tôi đã thử nghiệm nó và dường như làm việc tốt. Nghiêm túc, một triệu cảm ơn Daniel! : =) –

+0

Bạn có thể hiển thị ví dụ về cách truy vấn trên 'đối tượng RecommendedObject' có lọc theo' Object_Id' không? –

+0

@Christian, bạn có đang tham khảo http://stackoverflow.com/questions/21940396/fluentnhibernate-referencesany-how-to-use-queryover-with-filter không? –

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