【发布时间】:2015-04-24 04:11:35
【问题描述】:
我正在使用 NHibernate 的 QueryOver 来填充具有许多嵌套类的类的 IEnumerable。但是,这会在 Sql Profiler 中产生很多单独的选择语句。使用下面的示例,NHibernate 从 foo 表中选择结果,然后“循环”通过结果集中的每一行,从 bar、foobar 等中选择。理想情况下,我希望这是一个使用连接的选择语句,但我'不确定这是否可能。
我认为问题可能在于映射中的 Not.LazyLoad() 方法。
鉴于这些类和映射:
public class Foo
{
public virtual int FooId {get; set;}
public virtual Bar Bar {get; set;}
public virtual Baz Baz {get; set;}
}
public class Bar
{
public virtual int BarId {get; set;}
public virtual FooBar FooBar {get; set;}
...
}
public class FooMap : ClassMap<Foo>{
public FooMap(){
Schema("my_schema");
Table("foo");
LazyLoad();
Id(x => x.FooId).GeneratedBy.Identity().Column("foo_id");
References(x => x.Bar).Column("bar").Not.LazyLoad();
References(x => x.Baz).Column("baz").Not.LazyLoad();
}
}
public class BarMap : ClassMap<Bar>{
public BarMap(){
Schema("my_schema");
Table("bar");
LazyLoad();
Id(x => x.FooId).GeneratedBy.Identity().Column("bar_id");
References(x => x.FooBar).Column("foo_bar").Not.LazyLoad();
}
}
我正在通过以下方式使用 queryover 来填充 IEnumerable:
IEnumerable<Foo> foos;
using (ISession session = NHibernateSessionFactoryManager.Factory.OpenSession())
{
foos = session.QueryOver<foos>()
.Where(f => f.Baz.BazId == bazId).List();
}
这是我的 NHibernateSesssionFactory 管理器类:
public class NHibernateSessionFactoryManager {
private static readonly Object lockObject = new object();
private static readonly ISessionFactory SessionFactory = BuildSessionFactory();
private static ISessionFactory BuildSessionFactory(){
lock (lockObject){//make sure only one session factory is created per start of the app
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c
.FromConnectionStringWithKey("foobardb")))
.Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<FooMap>())
//.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
}
private static void BuildSchema(Configuration config) {
// export the database schema
new SchemaExport(config)
.Create(true,false);
}
public static ISession OpenSession(){
return Factory.OpenSession();
}
public static ISessionFactory Factory{
get{
return SessionFactory;
}
}
}
【问题讨论】:
标签: c# nhibernate fluent-nhibernate