我在 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(使用前将#替换为@)