2009-01-11 4 views
8

Giả sử bạn có hai bảng, "Người dùng" và "UserRoles". Sau đây là cách hai bảng được cấu trúc (bảng - cột):Câu hỏi thông thạo NHibernate

Users - UserID (int)

UserRoles - UserID (int), Vai trò (string)

Những gì tôi muốn là dành cho tôi "Thành viên "lớp trong miền của tôi có một vai trò quan trọng. Làm thế nào để xây dựng bản đồ Fluent NHibernate của tôi để đạt được điều này?

Trả lời

13

gì bạn đang tìm kiếm là một một tập hợp các yếu tố, trong đó trong bản đồ hbm giữa các ý kiến:

<set name="Roles" table="UserRoles"> 
    <key column="UserID" /> 
    <element column="Role" /> 
</set> 

Đối với thành thạo NHibernate bạn có thể lập bản đồ này như sau:

HasMany<string>(x => x.Roles) 
    .AsElement("Role"); 

Bạn cũng có thể cần chỉ định tên khóa bằng cách sử dụng WithKeyColumn(string).

0

Tôi tin rằng nó sẽ là

public User() 
    { 
    Id(x => x.UserID); 
    HasMany<UserRoles>(x => x.UserRoles).AsBag(); 
    } 

Bạn cũng sẽ cần phải chắc chắn rằng bạn ánh xạ lớp UserRoles của bạn cũng

+0

Điều này là UserRoles không phải là một lớp. Nó chỉ là một danh sách các chuỗi. Datatable không liên kết hai khóa ngoại, chỉ một khóa ngoài (UserID) và một tên vai trò (chuỗi). –

0

này cũng làm việc:

HasMany<Role>(u => u.Roles) 
       .WithTableName("UserRoles") 
       .Component(role => role.Map(r => r.Name)) 
       .AsList(); 

Bạn không cần để ánh xạ Vai trò hoặc UserRoles.

Hãy chắc chắn rằng Vai trò thực hiện IEquatable <Role> ;.

4

FWIW này có thay đổi minorly của ngày nay. Ánh xạ hiện tại là

HasMany<string>(x => x.Roles) 
    .Element("Role");