2009-12-21 37 views
12

thành thạo NHibernate không như thế này, ném một lỗi:Tự động hóa NHIbernate của Danh sách <string>?

{"Association references unmapped class: System.String"}

OK tốt, tôi có thể thấy tại sao điều này sẽ gây ra một vấn đề - nhưng giải pháp tốt nhất là gì?

Tôi không thực sự muốn nó lưu trữ danh sách chuỗi giới hạn trong một trường đơn lẻ, điều này sẽ trở nên xấu nếu danh sách của tôi chứa nhiều chuỗi.

Tôi cũng không thực sự muốn một bảng 'chuỗi', vì lý do rõ ràng.

Tôi đoán tôi có thể giải quyết vấn đề này bằng cách đóng gói List<string> bên trong một lớp học, nhưng điều này cảm thấy hơi nặng. Tôi bắt đầu nghĩ rằng nó là giải pháp tốt nhất mặc dù.

Cách tốt nhất để lấy Fluent NHibernate để xử lý vấn đề này là gì?

Tôi hoàn toàn mong đợi các giá trị này được lưu trữ trong một bảng khác. Tôi nghĩ có lẽ tôi đã có thể thiết lập một số quy ước tự động chỉ thị NHibernate 'Nếu bạn thấy class X có chứa List<*some primitive type*>, thì hãy tiếp tục và tự động tạo bảng tham chiếu ánh xạ tới bộ sưu tập này.

Bạn cảm thấy hơi nặng khi di chuyển và bọc mọi bộ sưu tập trong một lớp. Nếu đó là giải pháp tốt nhất tuy nhiên, sau đó được nó.

+1

nếu bạn không muốn nó như một chuỗi được phân cách trong một trường duy nhất và bạn không muốn nó trong một bảng khác, thì * ở đâu *? đây vẫn là một cơ sở dữ liệu quan hệ ... –

+0

Tôi không bị làm phiền bởi cách cơ sở dữ liệu quan hệ xử lý việc này. Tôi tự hỏi làm thế nào tôi có thể nhận được automapping để suy ra đây là những gì tôi muốn làm cho * tất cả các chuỗi * danh sách trong mô hình miền của tôi. – Alex

+0

@ Alex - theo như tôi biết, không có cách nào để nói với NHibernate Fluent cách ánh xạ TẤT CẢ các danh sách các chuỗi. Giải pháp tôi cung cấp trong câu trả lời của tôi yêu cầu ghi đè cho mỗi danh sách các chuỗi trong mô hình miền của bạn. Nó chỉ là một vài dòng mã cho mỗi ghi đè, do đó, nó không phải là quá xấu ... –

Trả lời

7

Tôi đã gặp sự cố tương tự này một vài tuần trước, với phao thay vì chuỗi.

how-do-you-automap-listfloat-or-float-with-fluent-nhibernate

Nó chỉ ra rằng automapping không làm việc với các kiểu dữ liệu.

Edit - Đây là không còn đúng nữa - đội FNH đã khắc phục vấn đề

Có rất nhiều mẫu mã trong câu trả lời chấp nhận câu hỏi của tôi, nhưng điểm mấu chốt là để thêm một ghi đè cho bạn danh sách các loại nguyên thủy ("RawY" trong ví dụ dưới đây):

public class DlsAppOverlordExportRunData 
{ 
    public virtual int Id { get; set; } 
    // Note: List<float> needs overrides in order to be mapped by NHibernate. 
    // See class DlsAppOverlordExportRunDataMap. 
    public virtual IList<float> RawY { get; set; } 
} 


// Must be in different namespace from DlsAppOverlordExportRunData!!! 
public class DlsAppOverlordExportRunDataMap : IAutoMappingOverride<DlsAppOverlordExportRunData> 
{ 
    public void Override(AutoMapping<DlsAppOverlordExportRunData> mapping) 
    { 
     // Creates table called "RawY", with primary key 
     // "DlsAppOverlordExportRunData_Id", and numeric column "Value" 
     mapping.HasMany(x => x.RawY) 
       .Element("Value"); 
    } 
} 

tôi mong chờ các phương pháp tương tự để làm việc với ILists các chuỗi.

+0

Ok điều này có vẻ thú vị. Đây có phải là thứ có thể được xác định thông qua các công ước không? Có vẻ như FNH đang tập trung vào các quy ước để tùy chỉnh tự động hóa. – Alex

+0

Tôi không nghĩ vậy. Tôi đã nhận được giải pháp bằng cách đặt câu hỏi trên danh sách gửi thư Fluent và tin rằng đó là một trong những tác giả FNH đã trao nó cho tôi. Nếu nó có thể được thực hiện bởi một quy ước duy nhất, tôi nghĩ anh ta sẽ gợi ý điều đó. –

1

Hãy suy nghĩ về nó theo cách này ... làm thế nào bạn sẽ làm điều đó mà không ngủ đông? Vâng, bạn có thể có một bảng với một cột nước ngoài và chuỗi? Bây giờ, làm thế nào để bạn làm điều đó với Hibernate? Bạn thiết lập một lớp khác với thuộc tính nhiều và một. Sau đó, bạn ánh xạ một bộ sưu tập của lớp đó.

+0

Ok, lấy điểm. Tôi chỉ không muốn tạo ra tất cả các lớp học tầm thường này để bao bọc các bộ sưu tập nguyên thủy. Tôi có thể tự động suy ra điều này cho tôi không? – Alex

+0

Ồ, bạn không cần phải tạo một lớp khác? Tôi nghĩ rằng có thể ... http: //nhforge.org/doc/nh/en/index.html#collections-ofvalues ​​xem cách họ đưa ra ví dụ về một tập hợp các int, có vẻ như bạn làm một bộ sưu tập thông thường rồi xác định thuộc tính phần tử cho chuỗi của bạn. – dotjoe

4

Vì tôi đã đăng câu trả lời đầu tiên của mình, nhóm Fluent NHibernate đã khắc phục sự cố này.

Giờ đây, bạn có thể tự động hóa ILists của các loại giá trị C# (chuỗi, int, float, v.v.).

Chỉ cần đảm bảo bạn có phiên bản FNH gần đây.

+0

Than ôi, điều này gần như là một năm muộn cho nhu cầu của tôi - bất kể tốt để thấy FNH thực hiện điều này, nó là trở ngại thực sự tôi gặp phải khi sử dụng nó cho một ứng dụng LOB lớn. – Alex

+0

Kudos Tom đã quay lại sau một năm để cung cấp bản cập nhật này. – MushinNoShin

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