Nhibernate通过主键获取记录的方法是T Get<T>(object id); 由于id的类型是object, 这样,调用时,当出现类型不匹配(比如数据表的主键的类型是int,但传入的是诸如"2"这样的字符串)就会报类似如下异常:
Provided id of the wrong type. Expected: System.Int32, got System.String
因为是object类型,所以,尤其是团队开发,很难保证不出现上述异常。
可以通过这种方式解决,得到实体类型T的主属性,然后对参数id进行类型转换。 问题是如何能够得到C#实体类的主属性呢? 我已经用System.ComponentModel.DataAnnotations.Key属性修饰主属性了。 或者说,还有没有别的解决方式?是不是可以通过NHibernate的session解决呢?我刚接触NHibernate,不太熟悉, 请大家赐教。
------解决思路----------------------
一般来说,如果你设计一个程序时使用“空洞的超类型”,那么就无法保证开发质量,只能靠大规模不断测试,而且必须等待测试结果。所以设计时应该应该采用尽可能具体的类型,强类型来设计。你的id是string、long,还是你自己定义的接口(或者虚拟父类型)都可以,不应该仅仅当作object。