String NHibernate Get&;字符串Id

String NHibernate Get&;字符串Id,string,nhibernate,case-sensitive,String,Nhibernate,Case Sensitive,我在NHibernate上有一个分配了字符串Id的实体,在按Id获取实体时有一个小问题 例如 假设有这样一个数据库记录 Id Description ------------------- AAA MyDescription 现在,如果我使用搜索id“aaa”的“Get”方法 MYENTITYTYPE entity=Session.Get(“aaa”) 返回正确的实体,但Id字段(entity.Id)是“aaa”,而我希望它等于“aaa” 总之,我希望“Get”方法返回与数据库中存

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

例如

假设有这样一个数据库记录

Id    Description
-------------------
AAA   MyDescription
现在,如果我使用搜索id“aaa”的“Get”方法

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

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


有可能吗?我该怎么办?

有趣的问题。我猜这是不可能的,因为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
缺点是,即使实体已经加载,您也将始终转到DB


现在,如果您将实体定义为{Id,Code,Description},其中Id是一个合成的POID(我建议HiloGuid),并且Code是现有的字符串Id,您将避免使用Get而不是使用该代码进行查询所导致的潜在错误。

,不幸的是,这是由于使用了遗留数据库:(因此,我尝试以这种方式使用ICriteria:Session.CreateCriteria(typeof(MYENTITYTYPE)).Add(Restrictions.Eq(“Id”,“aaa”))).UniqueResult()并且它可以工作。我怀疑这也适用于“复合Id”比如Get。你认为呢?查询将始终按照上述方式工作。如果你对复合id使用单独的类,你可能必须逐个字段进行查询(不一定;这只是一个关于如何解决潜在问题的猜测)。我对复合id类尝试了相同的语句,似乎也可以工作,但没有设置“Eq”对于每个属性。我已经重写了“GetHashCode”和“Equals”方法,但我不确定这是否足够。很高兴知道它可以工作。记住,如果它解决了您的问题,请接受答案。
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
//example with LINQ; you can use HQL, Criteria, etc
var foo = session.Query<Foo>().Single(x => x.Id == "aaa");