我遇到了意想不到的行为,这对我来说并不清楚。当然我可以使用不同的,但这是什么原因?
我有实体(流畅的自动映射):
public class Ticket
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual IList<Activity> Activities { get; set; }
}
public class Activity
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual Ticket Ticket { get; set; }
}
测试数据(1张包含5项活动的门票):
new Ticket { Id = 1, Activities = new List<Activity>
{
new Activity(), new Activity(), new Activity(), new Activity()
};
查询:
var report = GetSessionFactory()
.OpenSession()
.QueryOver<Ticket>()
.JoinAlias(ticket => ticket.Activities, () => activity)
.List<Ticket>();
我有以下结果:
答案 0 :(得分:4)
当你加入one-to-many
表时,你正在返回一个笛卡尔积,在你的情况下是1 x 5行。因此,如果您想沿着这条路线走,那么您需要添加.TransformUsing(Transformers.DistinctRootEntity)
您确定不想加载活动并使用延迟加载的优点来检索活动吗?在大多数情况下,这可能是更有效的方式。
Somehing如: -
var ticket = session.QueryOver<Ticket>.Where(w => w.Id == id).SingleOrDefault();
OR
var ticket = session.Get<Ticket>(1);
然后你可以简单地打电话
foreach(var activity in ticket.Activities)
{
// do something here....
}