Guid значения в Oracle с fluentnhibernate - PullRequest
1 голос
/ 03 сентября 2011

Я использовал беглый 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 при сохранении.он изменяет его на значение, которое он хранит в базе данных, но я все еще не уверен, почему он это делает или как \ если я могу это контролировать.

1 Ответ

0 голосов
/ 05 сентября 2011

Если вы намереваетесь назначить id самостоятельно, вам нужно будет использовать генератор идентификатора, отличный от значения по умолчанию, Guid.comb. Вы должны использовать assigned вместо этого. Таким образом, ваше отображение будет выглядеть примерно так:

Id(x => x.Field).GeneratedBy.Assigned();

Подробнее о генераторах идентификаторов вы можете прочитать в документации по nhibernate здесь:

http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-id-generator

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...