NHibernate 获取 & 字符串 Id

2024-05-16

我在 NHibernate 上有一个分配了字符串 Id 的实体,并且在通过 Id 获取实体时遇到了一些问题。

例子...

假设有这样的数据库记录......

Id    Description
-------------------
AAA   MyDescription

现在,如果我使用搜索 ID“aaa”的“获取”方法...

MYENTITYTYPE entity = Session.Get<MYENTITYTYPE>("aaa")

返回正确的实体,但 Id 字段(entity.Id)是“aaa”,而我希望它等于“AAA”。

总之,我希望“Get”方法返回与数据库中存储的 ID 相同的 id...具有相同的大小写。

有可能吗?我能怎么做?


有趣的问题。我的猜测是这是不可能的,因为 Id 可能存在before数据库调用。考虑以下:

var foo = session.Load<Foo>("aaa"); //no DB call, foo is a proxy
Console.WriteLine(foo.Id); //Prints "aaa";
var bar = foo.Bar; //Forces loading
Console.WriteLine(foo.Id); //No matter what, the Id can't change at this point

这说明了为什么具有含义的主键通常是一个坏主意的另一个原因,特别是在它们的输入不受控制的情况下。

现在,如果代替Get您使用查询,您将获得正确大小写的 Id:

//example with LINQ; you can use HQL, Criteria, etc
var foo = session.Query<Foo>().Single(x => x.Id == "aaa");

缺点是您将始终访问数据库,即使实体已经加载。

现在,如果您将实体定义为{ID、代码、描述}, where Id是一个合成的 POID(我推荐Hilo or Guid) and Code是现有的字符串Id,您将避免使用引起的潜在错误Get而不是使用代码进行查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NHibernate 获取 & 字符串 Id 的相关文章

随机推荐