我几天只使用流利的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值。它将它改变为它存储在数据库中的值,但是我仍然不确定它为什么这样做或者如果我可以控制它。
答案 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