我試圖弄清楚這個問題相當長的時間。我有一個黑客的方式來使它工作。Fluent Nhibernate複合鍵映射
我只想知道這是否可能在流利NHibernate映射。
說我有例如兩個表:
Table ComissionLevel
{
Year,
ComissionLevelID,
... other properties ....
}
primary key (Year,ComissionLevelID)
Table ClientCommission
{
Year,
ClientID,
CommissionLevelID_1,
CommissionLevelID_2,
... other properties ...
}
primary key (Year,ClientID)
foreign key CommissionLevel1 (Year,CommissionLevelID_1)
foreign key CommissionLevel2 (Year,CommissionLevelID_2)
目前我映射如下:現在
public ComissionLevelMap()
{
Schema("XXXX");
Table("ComissionLevel");
LazyLoad();
CompositeId()
.KeyProperty(x => x.Year, set => {
set.ColumnName("Year");
set.Access.Property(); })
.KeyProperty(x => x.CommissionLevelID, set => {
set.ColumnName("CommissionLevelID");
set.Length(10);
set.Access.Property(); });
HasMany<ClientCommission>(x => x.ClientCommissions)
.Access.Property()
.AsSet()
.Cascade.AllDeleteOrphan()
.LazyLoad()
.Inverse()
.Generic()
.KeyColumns.Add("Year", mapping => mapping.Name("Year")
.SqlType("NUMBER")
.Nullable())
.KeyColumns.Add("CommissionLevelID_1", mapping => mapping.Name("CommissionLevelID_1")
.SqlType("VARCHAR2")
.Nullable()
.Length(10));
HasMany<ClientCommission>(x => x.ClientCommission2s)
.Access.Property()
.AsSet()
.Cascade.AllDeleteOrphan()
.LazyLoad()
.Inverse()
.Generic()
.KeyColumns.Add("Year", mapping => mapping.Name("Year")
.SqlType("NUMBER")
.Nullable())
.KeyColumns.Add("CommissionLevelID_2", mapping => mapping.Name("CommissionLevelID_2")
.SqlType("VARCHAR2")
.Nullable()
.Length(10));
}
public ClientCommissionMap()
{
Schema("XXXXX");
Table("ClientCommission");
LazyLoad();
CompositeId()
.KeyProperty(x => x.ClientID, set => {
set.ColumnName("ClientID");
set.Length(10);
set.Access.Property(); })
.KeyProperty(x => x.Year, set => {
set.ColumnName("Year");
set.Access.Property(); });
References(x => x.ComissionLevel1)
.Class<ComissionLevel>()
.Access.Property()
.Cascade.None()
.LazyLoad()
.Insert()
.Update()
.Columns("Year", "CommissionLevelID_1");
References(x => x.ComissionLevel2)
.Class<ComissionLevel>()
.Access.Property()
.Cascade.None()
.LazyLoad()
.Insert()
.Update()
.Columns("Year", "CommissionLevelID_2");
}
我的問題是,每當我創建一個CommissionLevel並分配ClientCommission其收集,如果我通過call session.save(CommissionLevel)將它們保存起來,它會引起我的異常
<Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index>.
這裏我的問題是:
NHibernate會自動保存關係嗎?像:
ClientCommission commission = new ClientCommission{Year = 2012, ClientID =SomeGuid}; CommissionLevel newCommissionLevel = new CommissionLevel{Year = 2012, CommissionLevelID =NewCommissionLevelGuid}; newCommissionLevel.ClientCommission1s.Add(commission); newCommissionLevel.ClientCommission2s.Add(commission); CommissionLevelRepo.Save(newCommissionLevel);
當我打電話CommissionLevelRepo.Save(newCommissionLevel),NHibernate的應該也會更新ClientCommission.ComissionLevel1而ClientCommission.ComissionLevel2
還是我不得不說
ClientCommission.ComissionLevel1 = newCommissionLevel;
ClientCommission.ComissionLevel2 = newCommissionLevel;
- 對於我得到的異常,這是因爲NHibernate不會生成正確的列,它似乎會生成th ree年份專欄。因爲如果我手動創建兩個名爲ComissionLevelID1和CommissionLevelID2的屬性,請禁用ClientCommission上的.Insert()和.Update()它將正確保存它。
有人能告訴我映射這兩個類的正確方法嗎?
非常感謝。
只是一個想法。如果你正在介紹所有這些複雜性。你可能做錯了什麼。簡化您的映射和設計。你以後不會再維護它。 – DarthVader