Задача:
В таблице БД есть столец "recordDate" типа timestamp.
В классе — переменная recordDate типа DateDime (обернута в свойство только для чтения).
Нужно, чтобы при сохранении нового объекта в БД автоматически генерировалось значение recordDate в БД.
Обновление значения recordDate в БД запрещено, т.е. при обновлении, (даже если каким-то чудесным образом переменная объекта изменится) — в БД значение не должно менятся.
Как сделано сейчас:
Класс:
private DateTime recordDate = DateTime.MinValue;
public DateTime RecordDate { get { return recordDate; } }
В таком виде значение сохраняется, в БД содержимое отображается как <Binnary data>,
но вот при получении объекта из БД происходит исключение:
"NHibernate.ADOException: Could not cast the value in field recordDate9_0_ of type Byte[] to the Type TimestampType. Please check to make sure that the mapping is correct and that your DataProvider supports this Data Type.".
Как это правильно сделать? В документации ни слова.
K> <property name="recordDate" column="recordDate" access="field" type="Timestamp" insert="false" update="false" /> K>
K> В таком виде значение сохраняется, в БД содержимое отображается как <Binnary data>, K> но вот при получении объекта из БД происходит исключение: K> "NHibernate.ADOException: Could not cast the value in field recordDate9_0_ of type Byte[] to the Type TimestampType. Please check to make sure that the mapping is correct and that your DataProvider supports this Data Type.".
K> Как это правильно сделать? В документации ни слова.
The Transact-SQL timestamp data type is different from the timestamp data type defined in the SQL-2003 standard. The SQL-2003 timestamp data type is equivalent to the Transact-SQL datetime data type.
Повреждение мозга после ректальной биопсии — редкая штука (с) Хаус
timestamp (Transact-SQL)
Is a data type that exposes automatically generated, unique binary numbers within a database. timestamp is generally used as a mechanism for version-stamping table rows. The storage size is 8 bytes.
Повреждение мозга после ректальной биопсии — редкая штука (с) Хаус
Здравствуйте, server_mouse, Вы писали:
_>Здравствуйте, Keith, Вы писали:
K>> Маппинг: K>>
K>> <property name="recordDate" column="recordDate" access="field" type="Timestamp" insert="false" update="false" /> K>>
K>> В таком виде значение сохраняется, в БД содержимое отображается как <Binnary data>, K>> но вот при получении объекта из БД происходит исключение: K>> "NHibernate.ADOException: Could not cast the value in field recordDate9_0_ of type Byte[] to the Type TimestampType. Please check to make sure that the mapping is correct and that your DataProvider supports this Data Type.".
K>> Как это правильно сделать? В документации ни слова.
_>В MS SQL Timestamp!=Datetime _>SQL Server Books _>
_>The Transact-SQL timestamp data type is different from the timestamp data type defined in the SQL-2003 standard. The SQL-2003 timestamp data type is equivalent to the Transact-SQL datetime data type.
Ну об этом я догадывался. Я думал NHibernate сам может приводить из timestamp в DateTime.
timestamp же в БД хранит время? Значит его можно как-то сконвертировать в DateTime.
Неужели NHibernate этого не может? Зачем тогда type="Timestamp"?
Здравствуйте, Keith, Вы писали:
K> Ну об этом я догадывался. Я думал NHibernate сам может приводить из timestamp в DateTime. K> timestamp же в БД хранит время? Значит его можно как-то сконвертировать в DateTime. K> Неужели NHibernate этого не может? Зачем тогда type="Timestamp"?
Timestam не имеет никакого отношения ко времени и/или дате. В MS SQL это просто глобальный счётчик который гарантирует вам уникальное значение каждый раз когда вы его запрашиваете. Ни больше ни меньше.
Повреждение мозга после ректальной биопсии — редкая штука (с) Хаус
Здравствуйте, Keith, Вы писали:
K>Задача: K> В таблице БД есть столец "recordDate" типа timestamp. K> В классе — переменная recordDate типа DateDime (обернута в свойство только для чтения). K> Нужно, чтобы при сохранении нового объекта в БД автоматически генерировалось значение recordDate в БД. K> Обновление значения recordDate в БД запрещено, т.е. при обновлении, (даже если каким-то чудесным образом переменная объекта изменится) — в БД значение не должно менятся.
Переформулирую вопрос с учетом новых знаний:
В БД тип колонки datetime, все остальное остается таким же.
Как сконфигурировать NHibernate так, чтобы значение при сохранении генерировалось само (DateTime.Now)?
Еще желательно сделать запрет на обновление измененного свойства.
Может это и не возможно, но есть подозрение, что все-таки возможно при помощи generated="insert" и update="false".
Завтра конечно еще поэкспериментирую сам, но может кто-нибудь уже знает и поделится?
Здравствуйте, server_mouse, Вы писали:
_>Timestam не имеет никакого отношения ко времени и/или дате. В MS SQL это просто глобальный счётчик который гарантирует вам уникальное значение каждый раз когда вы его запрашиваете. Ни больше ни меньше.
не совсем "каждый раз когда вы его запрашиваете"
значение поля АВТОМАТИЧЕСКИ обновляется каждый раз когда происходит изменение строки таблицы, содержащей данно поле. (при создании / встевке естественно тоже)
... << RSDN@Home 1.2.0 alpha 4 rev. 1231>>
— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...