Tôi có yêu cầu để tải một đối tượng phức tạp gọi là Node ... nó cũng không phải là phức tạp ... nó trông giống như sau: -tải Háo hức Sử dụng thành thạo NHibernate/Nhibernate & automapping
Một Node có một tham chiếu đến EntityType trong đó có một một đến nhiều với tài sản mà lần lượt có một một đến nhiều với PorpertyListValue
public class Node
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType Etype
{
get;
set;
}
}
public class EntityType
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual IList<Property> Properties
{
get;
protected set;
}
public EntityType()
{
Properties = new List<Property>();
}
}
public class Property
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType EntityType
{
get;
set;
}
public virtual IList<PropertyListValue> ListValues
{
get;
protected set;
}
public virtual string DefaultValue
{
get;
set;
}
public Property()
{
ListValues = new List<PropertyListValue>();
}
}
public class PropertyListValue
{
public virtual int Id
{
get;
set;
}
public virtual Property Property
{
get;
set;
}
public virtual string Value
{
get;
set;
}
protected PropertyListValue()
{
}
}
Điều tôi cố gắng làm là tải đối tượng Nút bằng tất cả các đối tượng con cùng một lúc. Không tải trọng. Lý do là tôi có hàng ngàn đối tượng Node trong cơ sở dữ liệu và tôi phải gửi chúng qua dây bằng cách sử dụng WCF Service.I chạy vào lớp SQL N + 1 vấn đề. Tôi đang sử dụng Fluent Nhibernate với Automapping và NHibernate Profiler đề nghị tôi sử dụng FetchMode.Eager để tải toàn bộ các đối tượng cùng một lúc. Tôi đang sử dụng qyuery sau
Session.CreateCriteria(typeof (Node))
.SetFetchMode("Etype", FetchMode.Join)
.SetFetchMode("Etype.Properties", FetchMode.Join)
.SetFetchMode("Etype.Properties.ListValues", FetchMode.Join)
HOẶC sử dụng NHibernate LINQ
Session.Linq<NodeType>()
.Expand("Etype")
.Expand("Etype.Properties")
.Expand("Etype.Properties.ListValues")
Khi tôi chạy bất kỳ truy vấn trên, cả hai đều tạo ra một truy vấn duy nhất cùng với tất cả các bên ngoài trái tham gia, đó là những gì Tôi cần. Tuy nhiên, đối với một số lý do, IList trả về từ truy vấn không được nạp thuộc tính vào các đối tượng. Infact số nút trả về bằng số hàng của truy vấn, do đó, các đối tượng nút được lặp lại. Hơn nữa, các thuộc tính trong mỗi nút được lặp lại, và do đó, làm các giá trị danh sách.
Vì vậy, tôi muốn biết cách sửa đổi truy vấn trên để trả lại tất cả các nút duy nhất với các giá trị thuộc tính và danh sách bên trong chúng.
Cảm ơn Nabeel
Vào google tôi phát hiện ra về DistinctRootEntityResultTransformer nhưng chỉ giải quyết vấn đề cho đối tượng Gốc. Tôi vẫn nhận được các bản sao trong bộ sưu tập con. Mỗi đối tượng gốc trong danh sách trả về có một số lộn xộn sản phẩm Cartesian kỳ lạ trong bộ sưu tập con với nhiều phiên bản của cùng một thực thể. Bất kỳ ý tưởng? Đang chờ Nabeel – nabeelfarid
Tôi nghĩ rằng tôi đã tìm thấy giải pháp nhưng tôi muốn biết nếu số chính xác của nó. Bộ sưu tập con (EType.Properties, Etype.Properties.ListValues) bên trong đối tượng gốc (Nút) là IList. Và tôi đọc trong tài liệu rằng IList có thể chứa các bản sao, vì vậy nếu tôi thay đổi IList thành ISet/ ICollection, thì truy vấn không tải các bản sao trùng lặp trong các bộ sưu tập con . Nhưng giải pháp này đòi hỏi rất nhiều việc tái cấu trúc. Tôi muốn biết nếu có cách nào để đạt được điều tương tự bằng cách sử dụng IList cho trẻ em bộ sưu tập? Đang chờ, Nabeel – nabeelfarid
Tôi gặp vấn đề tương tự (sử dụng Fetchmode.Eager). Tôi khá thất vọng trong NHibernate cho việc này. Tôi thà có lỗi hơn dữ liệu không chính xác. – UpTheCreek