c# – 有没有办法让NHibernate将字符串键视为不区分大小写?
我在主键是字符串列的实体上使用NHibernate的二级缓存.数据库不区分大小写,但是当我使用相同的Id检索实体但具有不同的大小时,NHibernate将实体视为缓存中的不同实体.例如,我有一个设置表,其中Name列为主键.如果我尝试使用session.Get< Setting>(“TestMode”),Get< Setting>(“testmode”)或Get< Setting>(“TESTMODE”)尝试检索实体,它将进入数据库3次并放入第二级缓存中有3个独立的实体.如果我然后通过NHibernate更改我的设置实体上的内容,它将更新实际匹配实体上的外壳的缓存实体,因为它存储在数据库中(在本例中是名为“TestMode”的实体).问题是,其他实体仍将在缓存中,但将是陈旧的.
我理解为什么NHibernate会默认将Ids视为区分大小写,但似乎没有办法在实体级别或配置级别设置不区分大小写,就我所知.可以这样做,如果是这样,怎么办? 如果它有帮助,我使用Fluent NHibernate.我的Id列指定如下: Id(x => x.Name).GeneratedBy.Assigned().Column("Name"); UPDATE 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 虽然我怀疑它应该有所作为,但我正在使用HashtableCacheProvider进行所有这些测试. (对于生产,我们将使用付费缓存提供商) 解决方法
如果您将缓存视为带字符串键的字典,很明显键“TEST”和“test”是不同的,因为C#区分大小写.
但有些事情似乎并不合适.你怎么知道NH正在将三个实体放在二级缓存中?假设您使用的是不区分大小写的数据库,Get方法生成的所有三个查询都将返回相同的行,并且将使用查询返回的值来设置实体上的ID属性,而不是通过提供给Get的值来设置方法.实体也将使用实体的ID进行缓存.是否所有三个获取返回实例的ID都在相同的情况下(“TestMode”)? 如果我理解正确的话,请根据您对问题的修改进行更新: > Get(“TestMode”)按预期缓存对象,并在后续“TestMode”请求中从缓存中检索它 这就是我期望的行为.为id提供的值用于尝试在缓存中定位实体.如果找到匹配,则从缓存中检索实体;如果不是,则查询数据库.检索实体后,NHibnernate会尝试使用其id作为键将其添加到缓存中,但它已经存在,因此缓存的值将被更新,替换或忽略. 关键点是提供给查询的id用作在缓存中定位实体的键,但实体的id在添加到缓存时用作键. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |