2016-03-06 58 views
0

我有两个型号,DerbySpawn和DerbyArena一对多NHibernate的

DerbyArena.cs

public class DerbyArena 
{ 
     public DerbyArena() 
     { 
      DerbySpawns = new List<DerbySpawn>(); 
     } 
     public virtual int Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual short MaxPlayers { get; set; } 
     public virtual short MinPlayers { get; set; } 
     public virtual short Interior { get; set; } 
     public virtual short Model { get; set; } 
     public virtual float MinZ { get; set; } 
     public virtual IList<DerbySpawn> DerbySpawns { get; set; } 
} 

DerbySpawn.cs

public class DerbySpawn 
{ 
    public virtual int SpawnId { get; set; } 
    public virtual float SpawnX { get; set; } 
    public virtual float SpawnY { get; set; } 
    public virtual float SpawnZ { get; set; } 
    public virtual float SpawnA { get; set; } 
    public virtual DerbyArena DerbyArena { get; set; } 
} 

我的映射

DerbyArenaMap

public class DerbyArenaMap : ClassMap<DerbyArena> 
{ 
      public DerbyArenaMap() 
      { 
       Id(x => x.Id); 
       Map(x => x.Interior); 
       Map(x => x.MaxPlayers); 
       Map(x => x.MinPlayers); 
       Map(x => x.Model); 
       Map(x => x.Name); 
       Map(x => x.MinZ); 
       HasMany<DerbySpawn>(x => x.DerbySpawns) 
        .Inverse() 
        .AsBag(); 
       Table("DerbyArens"); 


      } 
} 

DerbySpawnMap

public class DerbySpawnMap : ClassMap<DerbySpawn> 
{ 
     public DerbySpawnMap() 
     { 
      Id(x => x.SpawnId); 
      Map(x => x.SpawnX); 
      Map(x => x.SpawnY); 
      Map(x => x.SpawnZ); 
      Map(x => x.SpawnA); 
      References(x => x.DerbyArena); 
      Table("DerbySpawns"); 

     } 
    } 

在DerbyArens列ID是主键,自动递增

在DerbySpawns列SpawnId是主键,自动递增和列DerbyArena是外键与表DerbyArens的关系,列Id

我这段代码中随机选择舞台:

using (ISession session = DbSession.OpenSession()) 
{ 
     arena = (from x in session.Query<DerbyArena>() orderby Guid.NewGuid() select x).First(); 
} 

但是当我使用

Console.Write(arena.DerbySpawns[y].SpawnX + " " + arena.DerbySpawns[y].SpawnY + " " + arena.DerbySpawns[y].SpawnZ + " " + arena.DerbySpawns[y].SpawnA); 

我得到异常

NHibernate.LazyInitializationException:初始化[SSS.Models.DerbyArena#1] - 不能延迟初始化角色集合:SSS.Models.DerbyArena.DerbySpawns,没有会话或会话已关闭

DbSession.cs

public static class DbSession 
{ 
    private static ISessionFactory _sessionFactory; 
    public static ISessionFactory Factory 
    { 
     get { return _sessionFactory ?? (_sessionFactory = CreateSessionFactory()); } 
    } 
    public static ISession OpenSession() 
    { 
     return Factory.OpenSession(); 
    } 

    private static ISessionFactory CreateSessionFactory() 
    { 
     return Fluently.Configure() 
      .Database(
       MySQLConfiguration.Standard 
        .ConnectionString("connectionstring(thiswork)") 
      //Your connectionstring goes here. 
      ) 
      .Mappings(m => 
       m.FluentMappings.AddFromAssemblyOf<DbMappings>()) 
      .ExposeConfiguration(TreatConfiguration) 
      .BuildSessionFactory(); 
    } 


    private static void TreatConfiguration(Configuration configuration) 
    { 
     var update = new SchemaUpdate(configuration); 
     update.Execute(false, true); 
    } 

} 

回答

0

最有可能你正在访问DerbySpawnsusing (ISession ...,而延迟加载在其上被启用。

由于会话由using处置,所以不会发生延迟加载。

您必须确保会话关闭后不会发生延迟加载。

  1. using (ISession ...内部完成整个工作单元。
  2. 或获取您的using (ISession ...里面的依赖关系:(您的查询.FetchMany
    • 使用预先加载。注意,结合你的'随机排序',这很可能会导致你this bug(标记为EF,但我相当有信心NH也会拥有它),迫使你使用more complex 'random sort'
    • 或通过访问属性触发延迟加载。如果这只是一个'虚拟'访问,这将是非常肮脏的...
    • 或强制在映射中获取此集合(影响所有DerbyArena加载,也很可能导致前面提到的错误)。