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
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" />
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.
- 1. Auto Increment Composite Key InnoDB
- 2. Hibernate Auto Increment ID
- 3. C# Class Auto increment ID
- 4. Django Model Auto Increment Primary Key Dựa trên khóa ngoài
- 5. MySQL - cách sử dụng VARCHAR như AUTO INCREMENT Primary Key
- 6. Heroku MySQL Auto Increment
- 7. Derby Auto-Increment và Eclipselink UnitOfWork
- 8. Xác minh ánh xạ nhibernate fluent nhibernate
- 9. Fluent NHibernate, join-subclass mapping
- 10. auto increment sau khi xóa từ một bảng
- 11. Fluent NHibernate nhận Id của đối tượng đã lưu
- 12. LINQ to Objects auto increment number
- 13. fluent nhibernate HasOne WithForeignKey không hoạt động
- 14. Fluent NHibernate Visual Designer
- 15. Fluent NHibernate LazyLoad Issues
- 16. SQL Server: tùy ý auto-increment của chính
- 17. Fluent Nhibernate left tham gia
- 18. Fluent NHibernate Bản đồ thuộc về trường tư nhân/được bảo vệ Không có tài sản lộ diện
- 19. NHibernate - Lỗi khử nước giá trị tài sản
- 20. one-to-one fluent nhibernate?
- 21. MySQL Auto Increment hoạt động như thế nào?
- 22. Fluent NHibernate HasManyToMany() Lập bản đồ
- 23. Fluent NHibernate, làm việc với giao diện
- 24. năm increment Auto trong vòng lặp mỗi năm
- 25. Auto-increment subquery trong lựa chọn công bố TSQL
- 26. NHibernate: Sử dụng Fluent Nhibernate để lưu các đối tượng con
- 27. Đóng tag với tài sản ID
- 28. Fluent NHibernate FluentMappings.AddFromAssemblyOf <> Phát hành
- 29. Fluent NHibernate ánh xạ tham chiếu đến một cột không phải là cột ID
- 30. Ánh xạ bảng Fluent-NHibernate không có khóa chính
Đừ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. –
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