2012-02-08 58 views
2

如何使用Fluent NHibernate加載完整的對象(其中所有asociated對象)?在這種情況下,該對象被命名爲「項目」並具有關聯的類別和圖片列表。映射文件是這樣的:加載完整的對象與流利NHibernate

 public ProjectMap() 
    { 
     Id(x => x.Id); 

     Map(x => x.Title).Not.Nullable(); 
     Map(x => x.Year); 
     Map(x => x.Slug).Not.Nullable(); 
     Map(x => x.Description).CustomSqlType("nvarchar(MAX)").Not.Nullable(); 
     References(x => x.Category, "CategoryId").Not.Nullable(); 
     HasMany(x => x.Gallery) 
      .Inverse() 
      .Cascade.All(); 
    } 

和存儲庫方法應該返回完整的對象:

public Project Read(int id) 
    { 
     using (var session = NHibernateHelper.OpenSession()) 
     { 
      var project = session.CreateQuery("FROM Project WHERE Id = :Id LEFT JOIN FETCH p.Category LEFT JOIN FETCH p.Gallery") 
       .SetParameter("Id", id).UniqueResult<Project>(); 
      return project; 
     } 
    } 

回答

3

我假設你想在默認情況下延遲加載,但有時你需要預先加載必要的時候。如果您始終想要加載(不推薦),則應該在映射中執行此操作,而不是使用Not.Lazyload並使用.Fetch()選擇提取策略。

否則,你將不得不在NHibernate中使用其中一種查詢方法來做你想做的事情。您可以使用HQL查詢或Linq查詢,也可以使用Criteria查詢來完成此操作。

這裏的LINQ查詢(這部作品在3.2,不知道這是否是可用在此之前)

session.Linq<Project>() 
    .Fetch(p => p.Category) 
    .FetchMany(p => p.Gallery).FirstOrDefault(); 

這裏有一個HQL版本

session.CreateQuery("SELECT p FROM Project p FETCH JOIN p.Category FETCH JOIN p.Gallery") 
    .UniqueResult<Project>(); 

這裏有一個標準版本

session.CreateCriteria<Project>("p") 
    .SetFetchMode("p.Category", FetchMode.Join) 
    .SetFetchMode("p.Gallery", FetchMode.Join) 
    .UniqueResult<Project>(); 
+0

我已經使用了「.CreateQuery(」FROM Project WHERE Id =:Id LEFT JOIN FETCH p.Category LEFT JOIN FETCH p.Gallery「) .SetParameter(「Id」,id).UniqueResult ();「但它不起作用..我仍然得到錯誤「正在初始化[Model.Entities.Category#1] - 不能初始化代理 - 沒有會話。」 – Ante 2012-02-10 12:26:13

+0

但與INNER JOIN .. tnx求助。 – Ante 2012-02-13 11:03:09