【问题标题】:How to have granular control of 2nd level cache when using polymorphism使用多态性时如何对二级缓存进行精细控制
【发布时间】:2011-11-30 17:09:18
【问题描述】:

我有大约 40 个类,它们都实现了 IEntity 接口。

在大约 40 个类中,许多使用“多对一”映射到 IEntity 属性。这方面的一个例子可能是:

"IEntity.cs"
public interface IEntity
{
   Guid ID
   ...Other properties (~7 of them)
}

"Item.cs"
public class Item : IEntity
{

   Public Guid ID {get;set;}
   ...Other IEntity Properties

   Public IEntity Owner {get;set;}  

}

我相信使用 NHibernate 来映射 Item 上的 Owner 属性,我需要使用 NHibernate 的继承映射之一,使用 IEntity 作为基础。

问题在于二级缓存的配置与类定义相关,而不是与子类相关。我必须同时对模型中的所有约 40 个类启用缓存,而且我不能只缓存我想要的类,例如类别。

有谁知道我如何映射一个具有抽象实体类型属性的实体,而不会失去做出二级缓存选择的能力?

【问题讨论】:

  • 我不能提供赏金,但如果你发布了一个好的答案,我会仔细查看你之前对其他问题的一些答案,看看它们是否也值得点赞。
  • 赏金可能仍然是正确的答案。一个用户返回并支持一堆其他帖子可能会触发垃圾邮件保护,并且所有代表将在一天后丢失。
  • 这听起来像你想要一个 映射而不是 请参阅ayende.com/blog/3966/nhibernate-mapping-any
  • @insta 不知道垃圾邮件过滤器。谢谢。
  • Chris 可以告诉我垃圾邮件过滤器是否会在明天取消他的一些分数 =) 任何映射都是解决方案。

标签: c# .net nhibernate many-to-one


【解决方案1】:

首先,我不确定我是否真的明白将属性类型定义为IEntity- 你确定Item 可以成为另一个项目的所有者吗? Employee 可以成为物品的所有者吗?
如果答案是肯定的,并且这就是您系统的业务逻辑,那么就没有什么可做的了。
否则,您可能会发现定义 IOwner 或什至 OwnerBase 基类有助于区分。
这也可能有助于区分要缓存哪些类和不缓存哪些类。

现在是缓存问题:

二级缓存的定义需要出现在两个地方:
1.类的映射
2.关联映射

在您的情况下,我相信您确实必须为所有 IEntity 类打开二级缓存。 但是如果您只为特定关联开启缓存,那么只有那些关联会被缓存。
(一个例外是使用 Get<T>()Load<T>() 方法,这也会导致您的对象被缓存。如果我没记错的话,您可以告诉 nHib not 将缓存用于具体查询)

【讨论】:

  • 是的,该项目可以由任何其他类型的实体拥有,或者至少属于它们的一个子集。我最终改用了 Any 映射。
猜你喜欢
  • 2018-07-09
  • 2012-07-30
  • 1970-01-01
  • 2010-10-03
  • 2018-06-10
  • 2015-02-05
  • 2013-07-01
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多