2

我需要設計有兩個簡單的實體領域:如何設計與實體引用實體域與NHibernate另一個SQL Server上的持久性

public class User 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Email { get; protected set; } 
    public virtual Country Country { get; protected set; } 
    ... 
} 

public class Country 
{ 
    public virtual int Id { get; protected set; } 
    public virtual string Name { get; protected set; } 
    ... 
} 

這一切都很好,並在域名界清楚,但問題是,用戶和國家堅持兩個不同的服務器上的兩個不同的數據庫(他們都是MSSQL 2005服務器)。

那麼,應該如何我正確地實施NHibernate的在不同的SQL Server的entites的持久性?

使用ID而不是在引用的對象?是的,這很簡單,但它在整個領域的事情上更加努力,讓域對象更像DTO。並且它將要求IUserRepository在ICountryRepository上獲取它以加載用戶實體。

鏈接服務器?嗯......不知怎的,我不喜歡它(分佈式事務和沒有XML列)。而且我應該知道如何使用它們,更重要的是,我應該如何配置NHibernate以便與鏈接的服務器有效地協作?

也許一些其他的解決辦法?

回答

0

我聽說有人在類映射中使用schema屬性來包含鏈接的服務器名稱(如otherserver.dbo),但我不知道有任何人在執行此操作時沒有遇到任何問題或其他問題。

有幾個DDD引導框架,讓你透明地映射實體到不同的數據庫(導致多個ISessionFactories,它將爲您管理)。 NCommon是我會推薦的。然而,這假定Country只存在於一個數據庫中,並且User只存在於另一個數據庫中。

至於交易......嗯,如果你使用一個TransactionScope和配置DTS,可能的工作。 NCommon使用也包裝TransactionScopeUnitOfWork API。

你將不得不改變User使Country只是一個ID。這是爲什麼。您最終會得到兩個會話工廠,一個映射爲Country,另一個映射爲User。如果你沒有做出這樣的改變,那麼當你保存User(因爲它們存儲在兩個不同的DB中)時,NHibernate會抱怨Country沒有映射。

現在您可以指示NHibernate忽略Country屬性,並保留Country,以便您的域不會更改。但是,下次從數據庫加載User時,Country將爲空。

+0

嗯...只是爲了澄清:NCommon將允許我transperently映射實體,我不會改變我的域模型或否,它不能這樣工作,我將不得不將國家實體更改爲countryId值對象? –

+0

使用NCommon,您仍然需要將Country更改爲CountryID並只存儲標識符。我會解釋爲什麼在一個更新的答案。 – HackedByChinese

+0

好的,我明白了。但是這種改變會如何幫助我使用NCommon?如果我理解正確,我仍然需要從不同的存儲庫手動加載國家實體 - 我可以做到這一點,沒有NCommon。 –

0

你可以從NHContrib使用NHibernate.Shards。

+0

Arent這是分配初級?它可以用於像Country這樣完全沒有實體的實體嗎? NHibernate.Shards的代碼已經完成,因此可以用於生產? –

+0

據我所知,它支持把實體放在不同的dbs中,它可以在生產中使用 – ivowiblo

+0

我看到這個項目有alpha版本類型: –