2008-11-02 29 views
52

Có cách nào để tồn tại một enum để DB bằng cách sử dụng NHibernate? Đó là một bảng của cả hai mã và tên của mỗi giá trị trong enum.Làm thế nào để tồn tại một enum bằng cách sử dụng NHibernate

Tôi muốn giữ enum không có thực thể, nhưng vẫn có khóa ngoại (biểu diễn int của enum) từ tất cả các thực thể tham chiếu khác đến bảng của enum.

+0

có bất kỳ câu nào trong số những câu trả lời này giải quyết được sự cố của bạn không? – UpTheCreek

+0

@Sosh, không, cho các enums quan trọng tôi đã cuộn một thực thể và cho những người khác tôi chỉ sử dụng giá trị int. –

Trả lời

0

Theo như tôi biết, điều này là không thể theo mặc định. Tuy nhiên, Google mang lại một số kết quả thú vị trên NHibernate Enum. Một trong những cách tôi có thể thử là Oran Dennison's Generic NHibernate Enum String Mapping, hoặc, nếu bạn có thể sửa đổi Enum, Persisiting Described Enums như mô tả trên NHibernate Forge.

+0

Cảm ơn, nhưng đây là tất cả đề cập đến chuỗi của enum, nơi tôi muốn có một khóa nước ngoài để đại diện int chính nó. –

6

Một giải pháp dễ dàng nhưng không quá đẹp:

Tạo trường số nguyên và đặt ánh xạ trong tệp ánh xạ tới trường. Tạo thuộc tính công khai sử dụng trường số nguyên.

private int myField; 
public virtual MyEnum MyProperty 
{ 
    get { return (MyEnum)myField; } 
    set { myField = value; } 
} 
13

Bạn có thể sử dụng loại enum trực tiếp: http://web.archive.org/web/20100225131716/http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-If-You-Mean-Enum.aspx. Nếu kiểu cơ bản của bạn là một chuỗi, nó nên sử dụng biểu diễn chuỗi, nếu nó là số, nó sẽ chỉ sử dụng biểu diễn dạng số.

Nhưng từ ngữ câu hỏi của bạn có vẻ như bạn đang tìm kiếm một thứ gì đó khác biệt, không hoàn toàn là một điều khó chịu. Có vẻ như bạn muốn một bảng tra cứu mà không cần tạo một lớp thực thể riêng biệt. Tôi không nghĩ rằng điều này có thể được thực hiện mà không tạo ra một lớp thực thể riêng biệt mặc dù.

+1

Liên kết đó dường như không hoạt động. Điều này nên: http://graysmatter.codivation.com/post/Justice-Grays-NHibernate-War-Stories-Dont-Use-Int-If-You-Mean-Enum.aspx – UpTheCreek

+0

Cảm ơn, liên kết liên kết được cập nhật. –

+8

Vẫn không làm việc cho tôi. – AlfeG

2

Thử sử dụng mẫu đồ thị. Uou sau đó có thể đưa logic vào các lớp bên trong của bạn. Tôi sử dụng khá nhiều điều này một cách tự nhiên khi có logic nên được chứa trong "enum". Ví dụ, mã bên dưới có IsReadyForSubmission() trừu tượng, sau đó được thực hiện trong mỗi lớp con lồng nhau (chỉ một lớp được hiển thị). HTH

[Serializable] 
public abstract partial class TimesheetStatus : IHasIdentity<int> 
{ 
     public static readonly TimesheetStatus NotEntered = new NotEnteredTimesheetStatus(); 
     public static readonly TimesheetStatus Draft = new DraftTimesheetStatus(); 
     public static readonly TimesheetStatus Submitted = new SubmittedTimesheetStatus(); 
     //etc 

     public abstract int Id { get; protected set; } 
     public abstract string Description { get; protected set; } 
     public abstract bool IsReadyForSubmission(); 

     protected class NotEnteredTimesheetStatus: TimesheetStatus 
     { 
      private const string DESCRIPTION = "NotEntered"; 
      private const int ID = 0; 
      public override int Id 
      { 
       get { return ID; } 
       protected set { if (value != ID)throw new InvalidOperationException("ID for NotEnteredTimesheetStatus must be " + ID); } 
      } 

      public override string Description 
      { 
       get { return DESCRIPTION; } 
       protected set { if (value != DESCRIPTION)throw new InvalidOperationException("The description for NotEnteredTimesheetStatus must be " + DESCRIPTION); } 
      } 
      public override bool IsReadyForSubmission() 
      { 
       return false; 
      } 

     } 
     //etc 
} 
105

Tại sao các bạn lại làm phức tạp điều này? Nó thực sự đơn giản.

Việc lập bản đồ trông như thế này:

<property name="OrganizationType"></property> 

Thuộc tính mô hình trông như thế này:

public virtual OrganizationTypes OrganizationType { get; set; } 

Các Enum trông như thế này:

public enum OrganizationTypes 
{ 
    NonProfit = 1, 
    ForProfit = 2 
} 

NHibernate sẽ tự động tìm tất cả ngoài. Tại sao nên gõ nhiều hơn bạn cần ????

+0

Tôi không quen với Hibernate vì vậy tôi không thể hiểu bạn đăng bài. Bạn có thể giải thích "thuộc tính mô hình" là gì không. Nó được định nghĩa ở đâu? –

+11

Tôi không hiểu tại sao câu trả lời của bạn không được bỏ phiếu nhiều hơn nữa. Bạn cung cấp câu trả lời trong mã rõ ràng dễ hiểu. –

+5

Điều này không làm việc trong nHibernate 2.1 vì nó gây ra bóng mờ: http://stackoverflow.com/questions/3247188/nhibernate-updates-unchaged-records – brainimus

3

Tôi đang sử dụng NHibernate 3.2, và các công trình vĩ đại này:

type="NHibernate.Type.EnumStringType`1[[enum_full_type_name, enum_assembly]], NHibernate" 

Không chắc khi EnumStringType generic đã nói thêm, mặc dù.

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