2009-06-15 25 views
9

Có thể thực hiện ánh xạ trong NHibernate mà không cần sử dụng Id không?Ánh xạ NHibernate với No Id

Những gì tôi đang cố gắng để làm được, gọi một thủ tục lưu trữ sử dụng

session.CreateSqlQuery(myQuery).AddEntity(typeof(MyEntity)); 

Thủ tục là một tổng hợp và không có trường Id được trả lại, nhưng tôi vẫn muốn tận dụng lợi thế của bản đồ NHibernate dữ liệu được trả về một thực thể. Điều duy nhất tôi đã đưa ra cho đến nay là có thủ tục thêm một trường "O là Id" hoặc một cái gì đó, và có thực thể có một trường Id giả.

Trả lời

3

Tôi thấy điều này thực sự là không thể. Dữ liệu được trả về từ thủ tục lưu sẵn phải có một Id. Nó làm việc để chỉ cần tạo một cột giả với một Id, và một thuộc tính giả trên đối tượng, nhưng tôi chỉ quyết định chuyển đổi dữ liệu được NHibernate trả về một đối tượng bằng tay.

Về cơ bản, bạn không được phép sử dụng các thủ tục được lưu trữ với NHibernate. Nó là một ORM afterall. Trong trường hợp của tôi, tôi không có lựa chọn nào khác ngoài việc sử dụng quy trình.

0

Tôi cần phải kiểm tra kỹ xsd, nhưng tôi tin rằng id hoặc id tổng hợp là bắt buộc. Tuy nhiên, theo tài liệu, tên là không cần thiết. Vì vậy, bạn sẽ có thể chỉ định một phần id gần như trống.

Trong tình huống tương tự, tôi đã đặt lớp thành mutable = "false" và ánh xạ id thành chỉ mục hàng và đặt trình tạo trong ánh xạ id được gán.

+1

Được rồi - câu hỏi ngớ ngẩn. Làm cách nào để ánh xạ tới chỉ mục hàng? Nó trông như thế nào trong tệp ánh xạ? Chúng tôi đã tìm kiếm điều này trong tài liệu và quyết định hỏi. – ferventcoder

4

Thực thể của bạn phải là "duy nhất" theo một cách nào đó, ngay cả khi nó không có trường Id.

Quyết định tài sản, khi lấy nhau, phải là duy nhất, và sử dụng một chìa khóa composit qua chúng ...

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 
0

Từ bài @Andy McCluggage của:

Bạn có thể rất nhiều làm điều này trong lập bản đồ:

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 

Tuy nhiên, bạn phải ghi đè lên Equals() và GetHashCode() trong mô hình của bạn:

public class MyClass 
{ 
    public virtual DateTime Property1; 
    public virtual string Property2; 
    public virtual int SomeOtherProperty; 

    public override bool Equals(object obj) 
    { 
     if(obj == null) 
      return false; 

     var t = obj as MyClass; 

     if(t == null) 
      return false; 

     if (this.Property1 == t.Property1 && this.Property2 == t.Property2) 
      return true; 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return (this.Property1 + "|" + this.Property2).GetHashCode(); 
    } 
} 
Các vấn đề liên quan