如何在使用多态时对二级缓存进行粒度控制

时间:2011-11-30 17:09:19

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

我有~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属性,我需要使用一个以IEntity为基础的NHibernate继承映射。

问题是第二级缓存的配置与类定义相关联,而不是与子类相关联。我必须在我的模型中同时打开所有~40个类的缓存,我不能只缓存我想要的类,比如类别。

有没有人知道如何映射具有属性的实体,该属性是抽象实体的类型而不会失去进行二级缓存选择的能力?

1 个答案:

答案 0 :(得分:1)

首先,我不确定我是否真的想到将属性类型定义为IEntity - 你确定Item可以成为另一个项目的所有者吗? Employee是否可以成为项目的所有者? 如果答案是肯定的,那就是你的系统的业务逻辑,那么就没有什么可做的了 否则 - 您可能会发现定义IOwner甚至OwnerBase基类来帮助区分这一点很有帮助。
这对于指定哪些类进行缓存以及哪些不进行缓存也可能有所帮助。

现在谈到缓存问题:

二级缓存的定义需要在两个地方进行:
1.班级的映射 2.关联映射

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