2014-08-25 2 views
0

Mapping файла:NHibernate + Oracle: Как избежать миллисекунды усечение при вставке

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="OracleHibernateTest" namespace="OracleHibernateTest"> 
<class name="TableRow" table="TIMESTAMP_TEST_2"> 
    <id name="Id" /> 
    <property name="Time" type="Timestamp"> 
     <column name="TIME" sql-type="TIMESTAMP(4)"></column> 
    </property>  
</class> 
</hibernate-mapping> 

Код:

var configuration = new Configuration(); 
    configuration.Configure(); 
    var export = new SchemaExport(configuration); 
    export.Create((s) => Trace.WriteLine(s), true); 
    var sessionFactory = configuration.BuildSessionFactory(); 
    using (var session = sessionFactory.OpenSession()) 
    { 
     var testItem = new TableRow() { Id = (new Random().Next()), Time = new DateTime(2014, 8, 25, 5, 12, 4, 587) }; 
     session.Save(testItem); 
     session.Flush(); 
    } 

Код выше будет вставить новую строку, но миллисекунды в колонке Время обрезаются.

Из исследования я обнаружил, что NHibernate создаст команду OracleParameter для SQL с параметром, где OracleType устанавливается в DateTime вместо TimeStamp. В Oracle DateTime нет миллисекунд.

+0

Что-то не так - в другом месте. Пример, который вы дали, будет вызывать ALWAYS с ** миллисекундами **. Ваше сопоставление и код верны. Проверите с каким-то профилиром, что передается в БД, я бы сказал ... –

ответ

0

После большего количества исследований я попытался обновить клиентские драйверы Oracle (ODAC 12c Release 2 12.1.0.1.2 Xcopy) до последней версии и решить эту проблему. Кажется, проблема с более старыми драйверами Oracle.

Смежные вопросы