2009-07-20 43 views
12

Có thể có một thuộc tính số nguyên của một lớp tự động tăng được quản lý bởi cơ sở dữ liệu nhưng không phải là một khóa chính (hoặc Id như NHibernate đề cập đến chúng)? Tôi đang gặp khó khăn trong việc tìm kiếm các ví dụ về cách thực hiện việc này. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.Fluent nhibernate auto increment non key (Id) tài sản

Trả lời

9

Hai tùy chọn.

  • nếu cơ sở dữ liệu 100% chịu trách nhiệm về điều này, bạn chỉ cần nói với NHibernate rằng thuộc tính được tạo và không bao gồm trong bất kỳ cập nhật/người dùng nào. Nhược điểm là NH sẽ cần phải thực hiện một lựa chọn bổ sung để giữ giá trị mới trong bộ nhớ.

    < property name = "Foo" tạo = "always" update = "false" insert = "false" />

  • nếu cơ sở dữ liệu là không có trách nhiệm và bạn chỉ muốn có này thực hiện tự động bạn có thể sử dụng một máy đánh chặn để đặt giá trị là 1 trên một chèn và để tăng giá trị 1 lên một bản cập nhật.

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors (11,1 - đánh chặn)

Bạn sẽ ghi đè OnSave() để tìm tài sản và thiết lập giá trị ban đầu và sau đó ghi đè OnFlushDirty() để tìm tài sản bất động sản và tăng.


Edit:

Tôi là một thằng ngốc, không để ý bạn nói thành thạo NHibernate.


Chỉnh sửa # 2:

Tôi nghĩ bạn cũng có thể quan tâm trong việc sử dụng cột này như một phiên bản?

< version name="Foo" generated="always" /> 
+1

Đừng lo lắng, nó gần như giống nhau. Bản đồ (x => x.Foo) .ReadOnly().SetAttribute ("được tạo ra", "luôn luôn"); Thuộc tính SetAttribute sẽ được thay thế bằng Generated.Always khi chúng tôi nhấn 1.0. –

+0

Tôi đã tải xuống FNH mới nhất và đã bị nhầm lẫn bởi .Update() không tham số. Tôi không chắc điều đó sẽ kết thúc như thế nào trong bản đồ. ReadOnly() có ý nghĩa. – anonymous

5

này làm việc cho tôi:

public class Potato 
{ 
    public virtual Guid Id { get; protected set; } 
    public virtual int LegacyId { get; protected set; } 
} 

public class PotatoMap : ClassMap<Potato> 
{ 
    public PotatoMap() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.LegacyId).CustomSqlType("INT IDENTITY(1,1)").Not.Nullable().ReadOnly().Generated.Insert(); 
    } 
} 

Về cơ bản, các số nguyên được thiết lập để được tạo ra bởi các cơ sở dữ liệu và NHibernate được hướng dẫn để lấy nó trên chèn.

Điều quan trọng cần lưu ý là ánh xạ chỉ là một nửa câu trả lời và nó sẽ không hoạt động nếu cột không được tạo dưới dạng IDENTITY. CustomSqlType được thêm vào ánh xạ với mục đích tạo sql thích hợp khi tạo các bảng với SchemaExport. Đây là sql tạo:

create table [Potato] (
     Id UNIQUEIDENTIFIER not null, 
     LegacyId INT IDENTITY(1,1) not null, 
     primary key (Id) 
    ) 

Ở phía bên kia, ReadOnly và Generated.Insert() sẽ cho NHibernate rằng giá trị là autogenerated bởi cơ sở dữ liệu duy nhất trên chèn, và do đó nó có để truy vấn cơ sở dữ liệu cho giá trị ở mỗi lần chèn.

Lưu ý rằng tôi chỉ kiểm tra điều này với Sql Server. Loại tùy chỉnh có thể sẽ thay đổi hoặc có thể không có sẵn trong các cơ sở dữ liệu khác.

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