Я использовал беглый nhibernate всего несколько дней, и он работал нормально, пока не попытался разобраться со значениями guid и Oracle.Я прочитал несколько хороших постов на эту тему, но ни одного, которые помогли бы мне решить проблему, которую я вижу.
Я использую Oracle 10g Express Edition.
У меня есть простая тестовая таблица в oracle
CREATE TABLE test (Field RAW(16));
У меня есть простой класс и интерфейс для сопоставления с таблицей
public class Test : ITest
{
public virtual Guid Field { get; set; }
}
public interface ITest
{
Guid Field { get; set; }
}
Карта классов проста
public class TestMap : ClassMap<Test>
{
public TestMap()
{
Id(x => x.Field);
}
}
Я начинаю пытаться вставить простое легко распознаваемое значение guid
00112233445566778899AABBCCDDEEFF
Вот код
var test = new Test {Field = new Guid("00112233445566778899AABBCCDDEEFF")};
// test.Field == 00112233445566778899AABBCCDDEEFF here.
session.Save(test);
// after save guid is changed, test.Field == 09a3f4eefebc4cdb8c239f5300edfd82
// this value is different for each run so I pressume nhibernate is assigning
// a value internally.
transaction.Commit();
IQuery query = session.CreateQuery("from Test");
// or
// IQuery query = session.CreateSQLQuery("select * from Test").AddEntity(typeof(Test));
var t in query.List<Test>().Single();
// t.Field == 8ef8a3b10e704e4dae5d9f5300e77098
// this value never changes between runs.
Значение, фактически сохраненное в базе данных, также каждый раз отличается, поскольку для запуска выше это было
EEF4A309BCFEDB4C8C239F5300EDFD82
Действительно запутано ....
Любая помощь приветствуется.
РЕДАКТИРОВАТЬ: я всегда удаляю данные из таблицы перед каждым запуском теста.Кроме того, использование ADO напрямую не вызывает проблем.
РЕДАКТИРОВАТЬ: ОК, моя первая проблема заключалась в том, что, хотя я думал, что удаляю данные из таблицы через командную строку SQL для oracle, когда я просматривал таблицу через пользовательский интерфейс oracle, этовсе еще были данные, и первый guid был, как я и ожидал, 8ef8a3b10e704e4dae5d9f5300e77098.
Fnhibernate по-прежнему изменяет значение guid при сохранении.он изменяет его на значение, которое он хранит в базе данных, но я все еще не уверен, почему он это делает или как \ если я могу это контролировать.