2011-04-09 78 views
3

NHibernate中有關於實體框架的導航屬性有類似的東西嗎?例如,而不是:NHibernate中有關於實體框架的導航屬性的東西類似嗎?

s.Save(new Product { Category = s.Get<Category>("FD"), Name = "Pizza" }); 

我希望我能寫:

s.Save(new Product { CategoryId = "FD", Name = "Pizza" }); 

我可以告訴NHibernate的不使用產品的類別屬性作爲一種機制來保存產品的類別?我想改爲使用CategoryId(閱讀:我不想使用DTO)。實體框架似乎能夠完全避免DTO模式,同時提供ORM的全部好處(可以避免使用導航屬性進行連接)。我希望英孚提供了兩全其美的(精益機制保存對象,即無需檢索屬性的對象)和導航機制,從EF

樣品查詢的東西:http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-code-first-walkthrough.aspx

public class Category 
{ 
    public virtual string CategoryId { get; set; } 
    public virtual string Name { get; set; } 

    public virtual IList<Product> Products { get; set; } 
} 

public class Product 
{ 
    public virtual int ProductId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string CategoryId { get; set; } 

    public virtual Category Category { get; set; } 
} 

[ UPDATE]

關於James答案,我試着在SQL Server Profiler中看到NHibernate的操作。

// this act didn't hit the Category table from the database 
var c = s.Load<Category>("FD"); 
// neither this hit the Category table from the database 
var px = new Product { Category = c, Name = "Pizza" }; 
// this too, neither hit the Category table from the database 
s.Save(px); 

只有當你真正訪問類對象。如果我理解你的問題是NHibernate的會打到數據庫

Console.WriteLine("{0} {1}", c.CategoryId, c.Name); 

回答

7

,要保存一個類別的產品而無需訪問數據庫加載類別對象。 NHibernate絕對支持這一點,你幾乎有正確的代碼。這裏是你如何做到在NHibernate的:

s.Save(new Product { Category = s.Load<Category>("FD"), Name = "Pizza" }); 

這不會碰到數據庫提取實際的範疇,但它只會保存產品用正確的Category.Id。請注意,你不需要(我會建議擺脫Product.CategoryId)。

現在爲什麼這個工作與session.Load(),但不session.Get()...與session.Get(),NHibernate必須返回該對象或null。在.NET中,在事實發生後,對象無法用null替換它自己。所以NHibernate被迫去數據庫(或L1緩存)來驗證「FD」類別實際存在。如果存在,則返回一個對象。如果不是,它必須返回null。

讓我們看看session.Load()。如果該對象不在數據庫中,則會引發異常。所以NHibernate可以從session.Load()返回一個代理對象,並延遲實際觸及數據庫。當你實際訪問這個對象時,NHibernate將檢查數據庫,並且如果該對象不存在,那麼可以在該點引發異常。在這種情況下,我們將產品保存到數據庫。所有NHibernate需要的是類別的PK,它在代理中擁有。所以它不必爲數據庫查詢Category對象。 NHibernate從來沒有真正需要水合一個實際的類別對象來滿足保存請求。

+0

對,使用s.Load (「FD」)和s.Save,Sql Server Profiler不會顯示任何對數據庫類別的命中。我愛NHibernate甚至更多^ _ ^感謝您爲我闡述它 – Hao 2011-04-10 01:17:29