2009-12-24 79 views
1

我是新來NHibernate並發現它非常有趣。我一直試圖將對象持久化到映射表(這個表在關係數據庫設計中打破了多對多關係),但迄今爲止還沒有這樣做。不過,我可以使用我當前的hibernate-mapping從映射表中檢索數據。幫助與NHibernate插入/更新

這裏是我的數據庫是什麼樣子:

組(的groupId,組名) 報告(reportID,所以reportName) GroupReports(的groupId,reportId)在數據建模方面

非常典型的,簡單的關係。

我知道這個問題已經被問了很多次,我看過很多很多。相信我,我真的。

這是我對集團實體類的映射:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataTransfer" namespace="DataTransfer"> 
    <class name="DataTransfer.Group, DataTransfer" table="GROUPS"> 
    <id name="GroupId"> 
     <column name="groupId" sql-type="int" not-null="true"/> 
     <generator class="native"/> 
    </id> 
    <property name="GroupName" column="groupName" type ="string" length="150" not-null="true"/>  
    <bag name="Reports" cascade="none" inverse="true"> 
     <key column="groupId"/> 
     <many-to-many column="reportId" class="DataTransfer.Report, DataTransfer"/>  
    </bag> 
    </class> 
</hibernate-mapping> 

而且我對報告實體類映射如下喜歡:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataTransfer" namespace="DataTransfer"> 
    <class name="DataTransfer.Report, DataTransfer" table="REPORTS" > 
    <id name="ReportId" column="reportId" type="int" unsaved-value="0"> 
     <generator class="native"/> 
    </id>   
    <property name = "ReportName" column="reportName" type="string" length="250" not-null="true"/> 
    <bag name="MappedGroups" table="GroupReports" cascade="all" inverse="false" lazy="true"> 
     <key column="reportId"/> 
     <many-to-many class="DataTransfer.Group, DataTransfer" column="groupId" />   
    </bag>  
    </class> 
</hibernate-mapping> 

據我已閱讀,這些映射應該允許我既要從關聯表GroupReports中檢索並保存映射數據。我的單元測試代碼只顯示選擇SQL語句,沒有插入到映射表中。

鑑於我的映射,什麼應該做堅持的映射數據?

回答

1

假設你正確設置你的SessionFactory /會話(因爲你正在SELECT語句),我敢打賭,你不使用交易或flusing會話。

推薦的方式NHibernate的更新數據是始終使用事務。像這樣的:

using(var session = sessionFactory.OpenSession()) 
using(var tx = session.BeginTransaction()) 
{ 
    var group = new Group {GroupName="Programmers Anonymous"}; 
    session.Save(group); 
    tx.Commit(); 
} 

這應該讓你去。

--UPDATE--

所以閱讀您的其他問題後,好像你想要這個代碼...

session.Save(report); 

自動持久化集團也是如此。但在您的映射中,您已將組合集合定義爲cascade="none"。將其更改爲cascade="save-update",它將修復它。

希望這能解決您的問題。

+0

(注意OP已經重新添加此答覆更新) –

0

感謝本,爲您的答覆。我直到今天才找到我的帖子。 :-)。

我其實在我的代碼使用事務。這裏是我的添加方法的代碼:

public int Add(Report obj) 
     { 
      //set the flush mode to Never so that session.save() does not cause a flush until the commit() 
      //on transaction is called 
      _session.FlushMode = FlushMode.Never; 
      using (ITransaction tx = _session.BeginTransaction()) 
      { 
       try 
       { 
        int newId = (int)_session.Save(obj); 
        tx.Commit();//this will cause the a flush of the session 
        return newId; 
       } 
       catch (HibernateException) 
       { 
        tx.Rollback(); 
        throw; 
       } 
      } 
     } 

我能夠用此代碼保存父對象。在我的情況下,我能夠將Report對象持久化到數據庫。這裏是既節省家長和使用許多一對多關係映射的子對象我的單元測試代碼:

const string reportCd = "TE"; 
const string reportName = "Test Report 6"; 
Report report = new Report; 
report.ReportCd = reportCd; 
report.ReportName = reportName; 
report.IsPublicFlag = 0; 

IList<Group> groups = new List<Group>(); 

Group group = new Group(); 

group.GroupId = 2; 
groups.Add(group); 

report.Groups = Groups; 
_provider.Add(report); 

的_provider對象是具有上述Add方法吾道對象。

此外,由於報告和組是多對多對象,因此它們包含彼此的IList。 Report對象組是Group對象的IList,Group對象具有Reports IList。

再次感謝您的幫助。

約翰

+0

我我的答案更新,以更好地希望解決的問題。 –