2011-10-09 61 views
4

我正在尋找一個快捷方式。我有一些具有多對多關係的NH實體。事情是這樣的:NHibernate:通過id將實體添加到多對多集合只有

public class Customer : EntityBase<Customer> 
{ 
    public virtual IList<Category> Categories { get; set; } 
} 

public class Category : EntityBase<Category> 
{ 
    public virtual IList<Customer> Customers { get; set; } 
} 

請記住,這是一個非常簡單的描述,所以抵制誘惑,建議我不使用許多一對多的安排或者說,我應該使用值類型或類似的東西。

在DB方面,這種關係是通過一個帶有兩列的單獨表格完成的 - Customer_IdCategory_Id

我真的很希望能夠將現有的Category添加到Customer而不必從數據庫中檢索完整的實體。也許這樣的事情:

customerEntity.Categories.Add(new Category { Id = 2 }); 

原因是應用程序是一個ASP.NET MVC應用程序,我使用ViewModels作爲我的視圖。這些Customer ViewModels最終的類別選擇爲List<int>,當我將該ViewModel映射到相應的Customer實體時,我希望能夠將這些類別ID吸引到Categories列表中,而不必擊中數據庫首先檢索它們。

我希望能夠做到這一點的部分原因是我想盡量減少數據庫調用,但我也希望我的映射器類能夠創建Customer實體,而無需撥打電話我的服務層去尋求其他對象...這似乎是不好的設計。我還希望避免必須添加另一個圖層來調用映射器,然後執行從存儲庫中提取實體的其他映射(它本身通過域服務層訪問)。

我檢出了idbag,但是對於我使用Fluent NHibernate的人來說,它不支持該構造,並且從我能從文檔中收集到的兩個關於該實體的List<int>的文檔中,仍然希望能夠訪問這些集合中的完整實體。

我是否問太多NHibernate?

回答

3

使用ISession.Load

customerEntity.Categories.Add(session.Load<Category>(2)); 

負載會返回一個代理,並且不打數據庫。你可以訪問代理的ID屬性而不需要訪問數據庫,但是如果你訪問任何其他屬性,NHibernate將加載代理。

+0

不幸的是,我的會話沒有直接暴露給ASP.NET MVC應用程序。我不得不打電話給另一個庫中的存儲庫。我希望必須讓我的ViewModel映射器必須直接與存儲庫層對話。有什麼辦法呢? –

+0

好吧,讓我糾正自己 - 我通常不會從MVC應用程序訪問會話。 –

相關問題