NHibernate Get & string Id

坚强是说给别人听的谎言 提交于 2019-12-10 22:18:28

问题


I've an entity with assigned string Id on NHibernate and I've a little problem when get an entity by Id.

Example...

Suppose that have a database record like this...

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

now, if I use "Get" method using search id "aaa"...

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

return right entity but Id field (entity.Id) is "aaa", while I wish it were equal to "AAA".

In summary I would like that "Get" method return the id identical to the one stored in the database...with the same case.

Is possible? How can I do?


回答1:


Interesting question. My guess is that it's not possible, because the Id might exist before the DB call. Consider the following:

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

This illustrates another reason why primary keys with meaning are usually a bad idea, especially if their input is not controlled.

Now, if instead of Get you use a query, you will get the right-cased Id:

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

The drawback is that you will always go to the DB, even if the entity is already loaded.

Now, if you defined your entity as {Id, Code, Description}, where Id is a synthetic POID (I recommend Hilo or Guid) and Code is the existing string Id, you will avoid potential bugs caused by using Get instead of a query with the code.



来源:https://stackoverflow.com/questions/10781147/nhibernate-get-string-id

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!