Trước hết, có, tôi đang sử dụng DistinctRootEntityResultTransformer.Bản sao khi háo hức tìm nạp tham chiếu (nhiều-một)
tôi có như sau (thành thạo NHibernate) lập bản đồ:
public FirstObjectMap()
{
Id(x => x.Id):
HasMany<SecondObject>(x => x.SecondItems).KeyColumn("FirstObject_ID");
}
public SecondObjectMap()
{
Id(x => x.Id).Column("ID");
References(x => x.ThirdObject).Column("ThirdObject_ID");
}
public ThirdObjectMap()
{
Id(x => x.Id).Column("ID");
HasMany<D>(x => x.FourthItems).KeyColumn("ThirdObject_ID");
}
public FourthObjectMap()
{
Id(x => x.Id).Column("ID");
}
Thông báo, rằng SecondObject đề cập đến ThirdObject (nghĩa là mấu chốt là trên SecondObject).
truy vấn của tôi trông như thế này:
var query = session.CreateQuery("select distinct first from " +
"FirstObject as first " +
"left join fetch first.SecondItems as second " +
"left join fetch second.ThirdObject as third " +
"left join fetch third.FourthItems as four where ...");
// This is not even needed as I'm using distinct in HQL
query.SetResultTransformer(new DistinctRootEntityResultTransformer());
var results = query.List<ReinsurableObject>();
Để thử nghiệm, tôi có 1 FirstObject, 1 SecondObject, 1 ThirdObject và 24 FourthObjects trong cơ sở dữ liệu. Truy vấn SQL trả về 24 hàng như được yêu cầu.
Tuy nhiên, đây là nhược điểm: NHibernate tạo:
1 FirstObject
24 SecondObject (should be 1)
24 x 1 ThirdObject (should be 1)
24 x 1 x 24 FourthObject (should be 24)
Vì vậy, NH cho bất cứ lý do tạo ra 24 SecondObject thay vì 1.
Tôi đoán nó không biết làm thế nào để lập bản đồ "tham gia fetch "(bên trái hoặc bên trong dường như không quan trọng) để tham khảo (tham chiếu đến ThirdObject trong SecondObject).
Tùy chọn của tôi là gì? Tôi không thể thay đổi mô hình dữ liệu, nhưng tôi cần phải háo hức tải tất cả.
Cảm ơn trước!
Theo như tôi biết, sản phẩm Descartes chỉ xảy ra khi tham gia các liên kết song song. Ví dụ, nếu A có B1 và B2 thì điều đó sẽ dẫn đến sản phẩm Descartes. Ayende cho thấy trong blog của mình exacly rằng tình hình (từ Blog b trái tham gia lấy b.Posts trái tham gia lấy b.Users). Nhưng nếu A, B, C, D là phân cấp (như tôi có), chúng không được tạo ra một sản phẩm Descartes. Vấn đề mà tôi đang phải đối mặt là tôi có hệ thống phân cấp nhiều-một, nhiều-một, một-nhiều. Phải không? – user315648
Không, tôi không tin rằng điều này là đúng bạn đang tải nhiều -> một -> nhiều -> một. Nhìn vào SQL được tạo ra và chạy điều này đối với cơ sở dữ liệu để xem điều gì đang xảy ra – Rippo
Mối quan hệ thứ 3 đến thứ 4 của nó gây ra nhiều liên kết thu thập do đó tạo ra 24 đối tượng thứ hai – Rippo