2

我有一个在 NHibernate 上分配了字符串 Id 的实体,当通过 Id 获取实体时我有一个小问题。

例子...

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

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

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

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

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

总而言之,我希望“Get”方法返回与存储在数据库中的 id 相同的 id ......在相同的情况下。

有可能吗?我能怎么做?

4

1 回答 1

1

有趣的问题。我的猜测是这是不可能的,因为 Id 可能在DB 调用之前就已经存在。考虑以下:

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, Code, Description},其中Id是合成 POID(我推荐HiloGuid)并且Code是现有字符串 Id,您将避免使用Get代码而不是查询导致的潜在错误.

于 2012-05-28T14:00:31.147 回答