我无法使用Criteria映射我的实体以正确加载对象图。我的模型看起来像这样:
客户 - > CustomerCarriers - >客户,运营商 载体 - >客户
客户通过CustomerCarriers关联类与运营商进行多对多。我正在使用Left join来获取我需要过滤的对象。我对第三个别名没有问题,但是Carrier一个没有用。它正在向所有运营商返回客户,而不仅仅是我指定的活动运营商。
我在这里做错了什么?如果我在CustomerCarrer上指定内部联接,则此方法有效,但只有在至少有一个活动运营商时才会返回客户。
以下是我查询的内容:
var q = Session.CreateCriteria<Customer>()
.Add(Expression.Eq("CustomerID", customerId))
.CreateAlias("_carriers", "cars", JoinType.LeftOuterJoin)
.CreateAlias("cars.Carrier", "car", JoinType.LeftOuterJoin, Restrictions.Eq("car.isActive",true))
.CreateAlias("_customerFreightClasses", "cfc", JoinType.LeftOuterJoin, Restrictions.Eq("cfc.isActive",true))
;
var customer = q.UniqueResult<Customer>();
return customer;
----更新---- 看看sql,我觉得我的问题不在于这个条件查询。我认为我的初步查询正在得到我想要的东西。但是,当我从代码中访问该属性时,我看到载体IsActive = False被加载,所以我认为即使我的初始查询是正确的,访问该集合也会得到任何尚未存在的内容。在我交付之前有没有办法关闭对象的懒惰?
我的客户映射会像这样到达CustomerCarrier:
HasMany<CustomerCarrier>(
Reveal.Member<Customer>("_carriers")
)
.Cascade.AllDeleteOrphan()
.Fetch.Join()
.Inverse()
.KeyColumn("CustomerID")
.AsSet()
;
我的CustomerCarrier映射会像这样到达运营商和客户:
References(x => x.Customer)
.Not.Nullable()
.Cascade.SaveUpdate()
.Column("CustomerID")
;
References(x => x.Carrier)
.Not.Nullable()
.Cascade.SaveUpdate()
.Column("CarrierID")
;