2012-03-09 37 views
6

Tôi muốn NHibernate chỉ tạo ra guids cho các thực thể nếu chúng không được thiết lập thủ công bởi người dùng hoặc ứng dụng. Về cơ bản, khi lưu các đối tượng với Guid mới() (tất cả các số không), NHibernate sẽ tạo một đối tượng. Khi lưu một đối tượng có một hướng dẫn khác không, nó nên sử dụng nó.NHibernate Máy phát điện Guid nếu mới

Tùy chọn duy nhất của tôi là viết trình tạo của riêng tôi?

chỉnh sửa Mọi người, tôi biết 'được chỉ định'. Tôi nên đã xác định tôi đã nhận thức được nó. Vì nó không làm những gì tôi muốn nó làm, nó không phải là tùy chọn tôi đang tìm kiếm. Viết máy phát điện của riêng tôi là một tùy chọn hoạt động, nhưng tôi muốn một cái gì đó khác. Tôi nghi ngờ không có gì khác.

Trả lời

1

Bạn đã thử đặt thuộc tính unsaved-value chưa?

<id name="Id" column="Id" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000"> 
    <generator class="guid.comb" /> 
</id> 

chỉnh sửa bây giờ tôi hiểu câu hỏi của bạn hoàn toàn tùy chọn khác thay vì tung ra máy phát điện riêng của bạn là sử dụng

<generator class="assigned" /> 

Tuy nhiên bạn không thể sử dụng SaveOrUpdate(). Thay vào đó bạn phải chỉ định rõ ràng cho NHibernate nếu đối tượng cần được lưu hoặc cập nhật bằng cách gọi phương thức Save() hoặc Update() của ISession. Ngoài ra, bạn sẽ luôn luôn cần phải thiết lập GUID bằng tay trên tất cả các thực thể mới của bạn. Đó là một lựa chọn.

+0

Không, tôi không có. Tôi không tin rằng sẽ làm việc vì nó sẽ xem xét một giá trị không 0 như được lưu. Mà nó có thể không được. Vì tôi muốn tự tạo ra một Guid. Tôi sẽ đặt giá trị không phải 0 trên Id. – wasabi

+0

Ah đó là khác nhau sau đó, bạn câu hỏi là không rõ ràng. – Rippo

+0

Gosh. Tôi đã nghĩ ra điều đó khá rõ ràng. – wasabi

2

Vấn đề ở đây là NH cần phải biết nếu đối tượng là mới hoặc nếu nó đã tồn tại. Nó thực hiện điều này thường bằng cách đặt ID.

Nếu bạn đã viết trình tạo của riêng mình, nó không giải quyết được sự cố, vì nó chỉ được gọi nếu đối tượng là mới.

  • Bạn có thể sử dụng máy phát điện assigned.
  • Bạn có thể sử dụng cột phiên bản để cho biết đối tượng có mới không. Tôi chưa bao giờ thử nó theo cách này, nhưng nó sẽ hoạt động. KHÔNG có bất kỳ dấu hiệu nào cho NH nếu đối tượng là nguyên nhân mới gây ra một số rắc rối. Tin tôi đi.
  • Bạn cũng có thể có số nguyên làm khóa chính và GUID là trường duy nhất thông thường.

tôi whould tạo id trong lớp constructor

class Entity 
{ 
    Guid id; 

    Entity(Guid id = Guid.Empty) 
    { 
    if (id == Guid.Empty) this.id = Guid.NewGuid(); 
    else this.id = id; 
    } 
} 
+0

Tôi không theo. Đối tượng IS mới. Tôi chỉ muốn cho phép mã người dùng của mình đặt giá trị Id theo cách thủ công, trước khi gọi Lưu. Giống như 'được chỉ định', ngoại trừ nó cần C ALNG làm việc nếu Id == Guid.Zero – wasabi

+0

Nếu bạn muốn gán ID trong mã người dùng, bạn cần sử dụng "được chỉ định". Nếu bạn muốn tạo một id khi mã người dùng không gán nó, chỉ cần làm điều này trong constructor của đối tượng. Nó đơn giản như vậy. –

+0

Stefan, nó sẽ là, ngoại trừ tôi muốn làm cả hai. – wasabi

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