Điều Paco nói là không đúng. Điều này có thể được thực hiện trong Fluent NHibernate. Tôi đã tự tìm kiếm trên web một thời gian, không thể tìm thấy ai nói về tùy chọn này, vì vậy tôi chỉ chơi đùa với FNHibernate một chút và cuối cùng cũng làm được.
Đây là kịch bản của tôi:
Tôi có hai bảng -
"FormFields" => Columns { "FieldId", "FieldName", "FieldType", "DisplayOrder" }
"FormStructure" => Columns { "FormId", "FormType", "FieldId" }
Đây là những thực thể của tôi:
public class FormStructure
{
public virtual Int32 FormId { get; private set; }
public virtual Int32 FormType { get; set; }
public virtual FormField FieldId { get; set; }
}
public class FormField
{
public virtual int FieldId { get; private set; }
public virtual String FieldName { get; set; }
public virtual int? FieldType { get; set; }
public virtual int? DisplayOrder { get; set; }
}
Tôi có một vài phương pháp trong truy vấn của tôi mà trả về một danh sách của các đối tượng FormStructure
. Tôi muốn các phương pháp này đưa cho tôi chúng theo yêu cầu của trường DisplayOrder
trong đối tượng FormField
và muốn DisplayOrder
có sẵn dưới dạng tài sản trong đối tượng FormStructure
của tôi vì các lý do khác. Điều này về cơ bản có nghĩa là tôi cần phải tham gia các bảng để tôi có thể lấy tất cả các cột từ bảng FormStructure cùng với cột DisplayOrder
từ bảng FormField
, tham gia chúng trên các cột FieldId
phù hợp.
Tôi đã làm gì để giải quyết này:
Tôi đã thêm một tính chất gọi là DisplayOrder để đối tượng FormStructure
tôi.
public virtual int? DisplayOrder { get; set; }
tôi đã thêm các phương pháp Join
để FormStructure
lớp bản đồ của tôi vì vậy nó trông như thế này.
public class FormStructureMap : ClassMap<FormStructure>
{
public FormStructureMap()
{
Table("FormStructure");
Id(x => x.Id);
Map(x => x.FormType);
References(x => x.Schedule).Column("ScheduleId");
References(x => x.Field).Column("FieldId");
Map(x => x.IsMandatory).Nullable();
Join("FormFields", m =>
{
m.Fetch.Join();
m.KeyColumn("FieldId");
m.Map(t => t.DisplayOrder).Nullable();
});
}
}
Phương pháp Join
sẽ rõ ràng tham gia giữa hai bảng trên cột bạn đã định nghĩa trong phương pháp KeyColumn trong tham gia.
Điều này cũng sẽ xóa một số hàng có giá trị null. Để tránh điều này (tôi đã gặp phải điều này gần đây), bạn có thể thêm m.Optional();
bên trong phương thức Join
.
tôi bây giờ có thể lấy một danh sách các FormStructure
đối tượng, ra lệnh cho họ bởi DisplayOrder
và thậm chí có DisplayOrder
có sẵn như là một tài sản trong đối tượng FormStructure
.
Điều này không thể thực hiện được trước đây, vì nó sẽ không nhận ra cột DisplayOrder
trong mệnh đề Đơn hàng tôi có ở đó.
Thú vị, tuy nhiên, tài liệu về phương thức Join() với ánh xạ lớp con cho đối số Hành động thứ 2 Tham gia() -> "điều này chỉ hoạt động nếu bạn đang ở trong chiến lược phân cấp bảng mỗi lần thừa kế. – PandaWood