2010-05-27 26 views
12

Tôi đang cố gắng ánh xạ chế độ xem mà không có số nhận dạng, nhưng nhibernate vẫn tạo một sql với cột id (cho tôi lỗi sql, vì cột ID không tồn tại trong db) . Có lẽ tôi hiểu sai về hàm tạo Id()?Chế độ xem lấy dữ liệu NHibernate trôi chảy không có mã định danh duy nhất

ý kiến ​​xây dựng:

Tạo một Id mà không có một tài sản tương ứng trong đối tượng miền, hoặc một cột trong cơ sở dữ liệu. Đây là chủ yếu để sử dụng với quyền truy cập chỉ đọc và/hoặc chế độ xem. Mặc định là một bản sắc int với một máy phát "tăng".

public class PersonMapping : ClassMap<Person> 
{ 
    public PersonMapping() 
    { 
     Table("person"); 
     ReadOnly(); 

     Id(); 
     Map(f => f.Name, "name"); 
    } 
} 

Trả lời

8

NHibernate yêu cầu ID. Phương thức doc cho biết nó tạo một ID không có thuộc tính tương ứng trong đối tượng miền của bạn - tuy nhiên cơ sở dữ liệu vẫn có một ID.

Nếu bạn không có trường nào trong bảng để đánh dấu làm số nhận dạng (phải là duy nhất ..) có thể bạn có thể cố gắng xác định một số cột có thể được tạo thành một id tổng hợp.

Với ví dụ như một bảng liên kết đơn giản mà liên kết một số int đến một int khác như

A | B 
----- 
1 | 2 
1 | 3 
2 | 2 

bạn có thể sử dụng ID composite miễn là tất cả kết hợp A/B là duy nhất.

public PersonMapping() 
{ 
    [...] 
    CompositeId() 
     .KeyProperty(x => x.A) 
     .KeyProperty(x => x.B); 
    [...] 
} 
+0

Có cách nào để hoàn toàn bỏ qua các trường db. Giống như Id (Guid.NewGuid) hoặc smth như thế này? –

5

Bạn có thể truy lục bản ghi dưới dạng đối tượng giá trị (thực thể không được quản lý) thay vì thực thể.

"14.1.5. Quay trở lại các tổ chức phi quản lý

Có thể áp dụng một IResultTransformer để truy vấn sql bản địa. Cho phép nó để ví dụ như trở lại các tổ chức phi quản lý.

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS") 
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO))) 

này truy vấn được chỉ định:

  • chuỗi truy vấn SQL
  • một biến kết quả

Các truy vấn trên sẽ trả về một danh sách các CatDTO đã được khởi tạo và tiêm các giá trị của NAMEBIRTHNAME vào tài sản hoặc các lĩnh vực tương ứng của nó. "

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