我理解为什么NHibernate会默认将IDs视为区分大小写,但似乎没有办法在实体级别或配置级别设置不区分大小写,就我所知.可以这样做,如果是这样,怎么办?
如果它有帮助,我使用Fluent NHibernate.我的ID列指定如下:
ID(x => x.name).GeneratedBy.Assigned().Column("name");
UPDATE
下面是我的Setting实体中的Equals()和GetHashCode()的实现.
public overrIDe bool Equals(object obj){ if (obj == null) return false; if (obj is Setting) { if (object.ReferenceEquals(this,obj)) return true; if (this.name.Equals(((Setting)obj).name,StringComparison.OrdinalignoreCase)) // Ignore case because our databases are case insensitive! return true; } return false;}public overrIDe int GetHashCode(){ return name.toupperInvariant().GetHashCode();}
更新2
我一直在使用NHibernate Profiler进行分析,并且对“TestMode”,“testmode”,“TestMode”,“Testmode”,“TESTMODE”(按此顺序)进行检索仅显示第二个“TestMode”的缓存命中.它显示“第二级缓存加载设置(TestMode / * ID * /)”,其余所有显示SELECT … FROM设置设置0_ WHERE setting0_.name =“testmode”(在调用要求的任何大小写中).
当单击链接“查看此语句产生的1行”时,它会向我显示名称列具有正确“TestMode”外壳的行,因此它清楚地检索具有该列本身的正确外壳的实体,但它似乎肯定将实体与调用Get()函数的ID相关联.这似乎不应该是正常行为,但我无法找到有关二级缓存如何工作的具体信息,只有NHibernate Cookbook中如何使用它的基础知识.
虽然我怀疑它应该有所作为,但我正在使用HashtableCacheProvIDer进行所有这些测试. (对于生产,我们将使用付费缓存提供商)
解决方法 如果您将缓存视为带字符串键的字典,很明显键“TEST”和“test”是不同的,因为C#区分大小写.但有些事情似乎并不合适.你怎么知道NH正在将三个实体放在二级缓存中?假设您使用的是不区分大小写的数据库,Get方法生成的所有三个查询都将返回相同的行,并且将使用查询返回的值来设置实体上的ID属性,而不是通过提供给Get的值来设置方法.实体也将使用实体的ID进行缓存.是否所有三个获取返回实例的ID都在相同的情况下(“TestMode”)?
如果我理解正确的话,请根据您对问题的修改进行更新:
> Get(“TestMode”)按预期缓存对象,并在后续“TestMode”请求中从缓存中检索它
> Get(“testmode”)或任何其他情况返回数据库
这就是我期望的行为.为ID提供的值用于尝试在缓存中定位实体.如果找到匹配,则从缓存中检索实体;如果不是,则查询数据库.检索实体后,NHibnernate会尝试使用其ID作为键将其添加到缓存中,但它已经存在,因此缓存的值将被更新,替换或忽略.
关键点是提供给查询的ID用作在缓存中定位实体的键,但实体的ID在添加到缓存时用作键.
总结以上是内存溢出为你收集整理的c# – 有没有办法让NHibernate将字符串键视为不区分大小写?全部内容,希望文章能够帮你解决c# – 有没有办法让NHibernate将字符串键视为不区分大小写?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)