2010-04-01 75 views
2

我正在工作瓦特/一箇舊數據庫設置 愚蠢 分別由一個字符id列和兩個字符列構成一個日期和時間組成的索引。我爲日期和時間列創建了一個ICompositeUserType,以映射到我的實體上的一個.NET DateTime屬性,該屬性在不是ID的一部分時自行工作。我需要以某種方式使用具有關鍵屬性映射的複合ID,其中包括我的ICompositeUserType,以映射到兩個字符日期和時間列。顯然瓦特/我的版本功能NHibernate的,CompositeIdentityPart沒有一個CustomTypeIs()方法,所以我不能只是做我重寫以下:如何使用Fluent NHibernate將複合標識映射到複合用戶類型?

mapping.UseCompositeId() 
    .WithKeyProperty(x => x.Id, CommonDatabaseFieldNames.Id) 
    .WithKeyProperty(x => x.FileCreationDateTime) 
    .CustomTypeIs<FileCreationDateTimeType>(); 

是這樣的,甚至可能瓦特/ NHibernate的更不用說流利?我一直無法找到任何這方面的信息。

UPDATE:

更加仔細閱讀NHibernate的documentation後,我發現NHibernate的不支持component composite IDs,但它並不像它支持自定義類型(即IUserTypeICompositeUserType)複合的ID。此外,我的Fluent版本不支持NHibernate對組件ID的支持(請參閱issue 387issue 346)。我可能會嘗試升級我的整個解決方案,看看它是否有效,併發佈一個答案,如果它的確如此......除非有人能告訴我沒有我必須這樣做...... 8o)

回答

0

NHibernate不支持將IUserTypeICompositeUserTypes用於合成ID。但是,它確實支持組件複合ID,但是Fluent NHibernate對此有限的支持。從我在源代碼中可以看到的情況來看,它不允許爲NHibernate允許的組件屬性指定列名稱。我現在不得不放棄,只需創建兩個string字段,即數據庫中的兩個string日期字段可以單獨映射,然後具有DateTime?屬性,該屬性翻譯了兩個string屬性。支持HeavyWave的評論:「雖然,我認爲你應該將每一列映射到自己的領域,並提供結合它們的附加屬性。」

mapping.CompositeId() 
      .KeyProperty(x => x.Id, CommonDatabaseFieldNames.Id) 
      .KeyProperty(x => x.FileCreationDateString, CommonDatabaseFieldNames.FileCreationDate) 
      .KeyProperty(x => x.FileCreationTimeString, CommonDatabaseFieldNames.FileCreationTime); 
0

嘗試添加該

mapping.Map(x => x.FileCreationDateTime).Columns.Add("FileCreationDate", "FileCreationTime").CustomSqlType("YourType"); 

雖然我不知道在一次指兩列的時候什麼意義呢CustomSqlType。可能沒有。你能創建一個視圖,將這些列投影到正常的DateTime嗎?

+0

不幸的是,我根本無法修改數據庫。如果取決於我,我們會完全重新設計這個東西。那麼你的代碼示例依賴於你所建議的視圖,還是可以在沒有視圖的情況下完成? – gabe 2010-04-04 22:41:03

+1

沒有看法。對它進行實驗,有時最好的方法是瞭解如果可以用Fluent來完成某些事情,那就是下載源代碼並查看單元測試。雖然,我認爲你應該將每一列映射到自己的領域,並提供結合它們的附加屬性。 – 2010-04-05 02:45:13

+0

檢查UTs的好主意。 關於在使用icompositeusertype的映射中組合字段的好處是,我不必在我的域對象中包含遺留的數據庫數據訪問格式轉換,它應該只包含業務邏輯。我對數據訪問翻譯和POCO類業務邏輯有着分離的關注。如果可以的話,我試圖保持這種抽象。我不能將此標記爲答案,因爲CompositeIdentityPart不包含Columns屬性。我需要將FileCreationDateTime分解爲組合鍵/ ID。 – gabe 2010-04-05 14:02:50

相關問題