2016-03-06 73 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加載,也很可能導致前面提到的錯誤)。