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 нет миллисекунд.


person Honza    schedule 25.08.2014    source источник
comment
Что-то не так - где-то еще. В приведенном вами примере ВСЕГДА выдается оператор с миллисекундами. Ваше сопоставление и код верны. Проверьте с помощью какого-нибудь профилировщика, что передается в БД, я бы сказал...   -  person Radim Köhler    schedule 26.08.2014


Ответы (1)


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

person Honza    schedule 26.08.2014