2017-05-25 44 views
0

使用NHibernate的Mapping.ByCode,我如何從Oracle序列中獲取組合鍵的初始值?下面如何使用Mapping.ByCode從Oracle序列中獲取NHibernate組合鍵的值?

ComposedId(map => 
{ 
    map.Property(x => x.Column1); 
    map.Property(x => x.Column2); 
}); 

適用於一個單一的鍵,但ComposedIdIComposedIdMapper使用,這似乎不具有相當於IIdMapperGenerator

Id<decimal>(x => x.Id, o => 
{ 
    o.Column("ID"); 
    o.Generator(Generators.Native, genMapping => genMapping.Params(new { sequence = "MY_SCHEMA.MY_ID_SEQ" })); 
}); 

回答

1

如果從序列產生一列在每個插入時遞增,它應該是獨一無二的。所以它可以被映射爲單個列ID。

複合ID不允許生成器,因爲它們本質上是分配給另一個表的某個主鍵或某種枚舉值(如「實體類型」(地址類型,電話類型,無論))。

如果您想爲序號使用序號,請使用單個列ID,而不是複合ID。

它看起來對我來說使用一個具有唯一值生成的列的composite-id很不妥:儘可能避免使用composite id。如果該值是唯一的,則不需要任何其他列作爲主鍵。

如果您確實需要,您仍然可以使用一個序列來分配複合ID的一部分,但您必須自己調用獲取其值並將其分配給您的複合ID的序列。使用ISession.CreateSQLQuery("adequate sql for your db")這樣做。你可以在你的會話工廠公開的方言對象的幫助下建立你的SQL。 (致電ISession.GetSessionImplementation().Factory.Dialect.GetSequenceNextValString("sequenceName")。)

+0

我同意這個設計有點奇怪。這是一個現有的回購,這個特定的實體之前沒有被使用過,我正在使用它。看起來有些情況下這些鍵是手動設置的,有些是需要自動生成的,所以我認爲你的'CreateSQLQuery'具有手動分配功能。謝謝! –

+0

@EricEskildsen,我用方言重新調整了它的代碼。我忘記了這個屬性只能從實現接口中獲得。在答案中,我提供了一個「無投票」的解決方案。從'ISessionFactory',它可以通過將其轉換爲'ISessionFactoryImplementor'來代替。 –

相關問題