顶者有分!NHibernate因为一级缓存,导致数据不一致的问题!

lszh001 2011-10-13 04:23:47
假设有两表表

表1 用户表(UserTable) 两个字段 “UserID”为主键

UserID UserName

U001 x某


表2 地址表(AddressTable) 三个字段 “AddressID”为主键 “UserID_fk”为外键,对应上“UserTable”的主键

AddressID UserID_fk AddressDetial

A001 U001 xx省XX市


视图(VUser) 就是把用户和地址连起来
SELECT [UserID],[UserName],[AddressDetial] FROM [UserTable] LEFT JOIN [AddressTable] ON [UserID_fk]=[UserName]

其中视图(VUser)是为了方便完整的信息在列表上显示,也方便多表多条件查询,读取方式就是把视图也当成一个表,创建了一个实体

现在问题出来了

问题1:
> 先用视图查出了一行记录(为了简单,假设就一条记录)
> 然后我用“Get()”和“Update()”更新了UserTable这条记录的UserName(比如由“x某”改为“y某”)
> 然后我刷新列表(列表是由视图出来的,所以和“Update()”的不是一个实体),列表不更新,因为被一级缓存了

各位有什么好的办法解决吗?
...全文
234 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lszh001 2011-10-25
  • 打赏
  • 举报
回复
抱歉“PublicGe”,点漏了,呵呵
lszh001 2011-10-19
  • 打赏
  • 举报
回复
一级缓存还有一个问题,我现在要做一个分类树,设计上是无限级的,如下

C_ID 分类主键
C_PID 父分类ID
C_Name 分类名

我在分类的实体里有一个sonCategoryList的属性,并配置了XML,含义很名显,当前分类的子类。

至此,读取很正常,能到到该分类(A)下的所有子类的List。

但我把这个分类(A)下的一个子分类(A1)执行session.delete(A1)后,这个分类(A)的sonCategoryList下的被删除的子分类(A1)还在


原因应该就是这个分类(A)被一级缓存了
PublicGe 2011-10-18
  • 打赏
  • 举报
回复
顶一个
lszh001 2011-10-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 langmafeng 的回复:]

NH不是这么用的,NH作为一个ORM工具,其设计原意是建议你把数据和对象之间一一映射,而不是把一份数据映射到多个对象上,你不应该建立与VUser想对应的实体,或者说这个与VUser对应的实体的数据不应该直接由NH从数据库里直接映射出来,而应该由你自己在内存里进行组装

NH只是一个底层的工具,而你这样做相对于把隐含的业务逻辑也扔给NH去处理了
[/Quote]

很到位的解释,受教了,谢谢!
langmafeng 2011-10-17
  • 打赏
  • 举报
回复
NH不是这么用的,NH作为一个ORM工具,其设计原意是建议你把数据和对象之间一一映射,而不是把一份数据映射到多个对象上,你不应该建立与VUser想对应的实体,或者说这个与VUser对应的实体的数据不应该直接由NH从数据库里直接映射出来,而应该由你自己在内存里进行组装

NH只是一个底层的工具,而你这样做相对于把隐含的业务逻辑也扔给NH去处理了
lszh001 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liuqian4243 的回复:]

在配置文件中,设置表关联关系.

每次更新后,强制清空相应缓存数据.

或者根本不用缓存得了.
[/Quote]

“强制清空相应缓存数据”,怎么清呢?

NH的一级缓存好像关不了吧
hsphsphsp 2011-10-14
  • 打赏
  • 举报
回复
顶。。。
linkkee 2011-10-14
  • 打赏
  • 举报
回复
UP一下
cf370697816 2011-10-14
  • 打赏
  • 举报
回复
学习 帮顶
Ny-6000 2011-10-14
  • 打赏
  • 举报
回复
在配置文件中,设置表关联关系.

每次更新后,强制清空相应缓存数据.

或者根本不用缓存得了.
lszh001 2011-10-14
  • 打赏
  • 举报
回复
用外连接?能具体些吗?
q198708wyp 2011-10-13
  • 打赏
  • 举报
回复
问题 也看了 但是 我想到的 如果 你要把两个 的表的相关信息连接起来 用外连接 不知道可以要你实现的效果不
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目中应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术中的2种来减少层与层之间的依赖等。6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧