2009-07-27 27 views
9

首先,我有如下表:功能NHibernate - 保存實體與複合鍵

CREATE TABLE CustomerHub (
    CustomerId INT NOT NULL, 
    HubId INT NOT NULL 
) 

,我有映射到該實體:

public class CustomerHub 
{ 
    public int CustomerId {get;set;} 
    public int HubId {get;set} 

    //GetHashCode, Equals, Etc... 
} 

使用這個映射:

public class CustomerHubMap : ClassMap<CustomerHub> 
{ 
    UseCompositeId() 
     .WithKeyProperty(x => x.CustomerId) 
     .WithKeyProperty(x => x.HubId); 
} 

我遇到的問題是,當我創建一個類型爲CustomerHub的新實體並嘗試保存它時,沒有任何東西被持久化到數據庫。我能夠檢索一切正常,只是不保存它們。例如:

//this will work 
var x = session.CreateCriteria(typeof(CustomerHub)); 

//this will not 
using (var trans = session.BeginTransaction()) 
{ 
    var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
    var y = session.SaveOrUpdate(custHub); 
    trans.Commit(); 
} 

奇怪的是沒有任何異常被拋出,它只是沒有做任何事情。我啓動了NH Profiler(優秀的工具!),看起來它不會向數據庫發佈任何類型的插入命令。

想法?

注意:我知道這個表看起來很像聯接表(因爲它在技術上是),並且最好在另一個實體(如Customer)上擔當ManyToMany關係......但由於某些極其棘手的數據設計(即沒有Hub表),將連接表映射到一個實體並且以這種方式使用它是非常簡單的。

回答

6

編輯(在上面放)

引自NHibernate的文檔:

由於其固有的性質,使用這種發電機的實體不能被通過的ISession的saveOrUpdate()方法的方法保存。相反,如果通過調用ISession的Save()或Update()方法來保存或更新對象,則必須明確指定NHibernate。

http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id-assigned(5.1.4.7)

複合ID具有發電機=分配。

這又回到了複合ID =吸吮:)


您還沒有發出沖洗或提交。您可能習慣使用類似身份的東西,在保存時發出INSERT,但複合由您的代碼分配,而不是由數據庫分配,因此您需要刷新/提交以進行插入。


var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
var y = session.SaveOrUpdate(custHub); 
session.Flush(); 

using(var tx = session.BeginTransaction()) 
{ 
    var custHub = new CustomerHub {CustomerId = 293, HubId = 1193}; 
    var y = session.SaveOrUpdate(custHub); 
    tx.Commit(); 
} 

而且,一個音符:使用組合鍵會讓你恨你的生活。許多事情與組合鍵不一樣,它並不是很明顯。基本上NHibernate可以做更少的工作,所以你必須撿起鬆懈。

+0

感謝您的快速回答。爲了簡潔起見,我把它放在了外面,但我把所有的呼叫放在一個與第二個例子非常相似的代碼中。我也試過沖洗沒有運氣。 – jckeyes 2009-07-27 19:19:08