2011-11-06 86 views
1

我有這樣的問題:映射不起作用

假設我有一個用戶,他是卡的性質:

public class User: Entity 
{ 
... 
public virtual IList<Card> Cards { get; set; } 
... 
} 

<class name="User" table="Users"> 
    <id name="Id" column="UserId"> 
     <generator class="guid"/> 
    </id> 
    <version name="Version"/> 
    ... 
    <list name="Cards" cascade="all" inverse="true"> 
     <key column="ViolatorId" not-null="true"/> 
     <index column="CardIndex"/> 
     <one-to-many class="Card"/> 
    </list> 
    ... 
</class> 

然後我從數據庫中獲取用戶,將其添加到卡的列表中,並調用session.Update()。

生成此SQL代碼:

INSERT INTO Cards 
      (Version, 
      ViolatorId, 
      ModeratorId, 
      IssueDate, 
      TermDate, 
      Cause, 
      Type, 
      CardId) 
VALUES  (1 /* @p0_0 */, 
      '6872df65-a1d7-40ef-abec-c14af96f3388' /* @p1_0 */, 
      '06060a30-252a-4f29-84fe-af5da110f049' /* @p2_0 */, 
      '2011-11-06T17:20:11.00' /* @p3_0 */, 
      '2011-11-06T22:20:11.00' /* @p4_0 */, 
      'Ad personam' /* @p5_0 */, 
      'Red' /* @p6_0 */, 
      '0454bbba-5ec9-429f-8830-d9cc33588f7a' /* @p7_0 */) 

的問題在於,所述請求不包含CardIndex的值,並填充它在數據庫中作爲NULL。

如何使NHibernate正常工作?

+0

當然,在這種情況下我可以使用Bag,但在項目中我有類似的例子。 –

回答

0

我已經使用Fluent NHibernate映射來定義實體映射。在你的情況下,用戶和卡實體之間有一對多的關係。爲了級聯保存/更新/刪除正常工作,您必須在兩個實體之間定義適當的兩個映射。另外,Cards實體應該對用戶實體有參考。指使用功能NHibernate下面的鏈接對如何這種類型的映射被定義(在C#):

http://wiki.fluentnhibernate.org/Fluent_mapping#HasMany_.2F_one-to-many http://wiki.fluentnhibernate.org/Fluent_mapping#References_.2F_many-to-one

雖然代碼是用C#給出的,但我認爲它不應該很難理解發生了什麼。

您還可以嘗試以下方法來級聯保存父子關係類型的實體。

public void Test() 
{ 
    using (IStatelessSession statelessSession = _sessionManager.OpenStatelessSession()) 
    { 
     using (ITransaction transaction = statelessSession.BeginTransaction()) 
     { 
      statelessSession.Insert(<ParentEntity>); 
      foreach(var childEntity in ParentEntity) 
      { 
       statelessSession.Insert(<childEntity>); 
      } 
      transaction.Commit(); 
     }  
    } 
} 

但是,爲了正常工作,應該明確定義您的映射。

+0

流利很好,但現在完全在他的行動或混亂的項目,我不想。但無論如何感謝您的幫助。 –

+0

我使用流利的NHibernate,所以我用它作爲分享我的知識的媒介。映射的想法實際上是相同的,並且在運行時(不知道它的運行時間或編譯時間),生成的Sql將完全相同。 –

+0

我明白這一點,我只是想找到我做錯了什麼。也許我錯過了一些屬性? –