使用fluentnhibernate在Oracle中使用Guid值

时间:2011-09-03 13:45:39

标签: oracle nhibernate fluent-nhibernate

我几天只使用流利的nhibernate并且它一直很好,直到尝试处理guid值和Oracle。我已经阅读了很多关于这个主题的帖子,但没有一个能帮助我解决我所看到的问题。

我使用的是Oracle 10g快递版。

我在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 UI查看表时,它仍然有数据,第一个guid就像我应该预计8ef8a3b10e704e4dae5d9f5300e77098。

Fnhibernate似乎仍在改变保存时的guid值。它将它改变为它存储在数据库中的值,但是我仍然不确定它为什么这样做或者如果我可以控制它。

1 个答案:

答案 0 :(得分:0)

如果您打算自己分配id,则需要使用与默认值Guid.comb不同的id生成器。您应该使用assigned代替。所以你的映射看起来像这样:

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

您可以在nhibernate文档中阅读有关id生成器的更多信息:

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