我有大约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映射Owner属性到Item,我将需要使用一个NHibernate的继承映射使用IEntity作为基础。
问题是第二级缓存的配置与类定义绑定,而不是与子类绑定。我必须一次打开模型中所有40个类的缓存,而且我不能只缓存我想要的类,比如类别。
有没有人知道我如何映射一个实体,有一个属性,是一个抽象实体的类型,而不会失去能力,使第二级缓存选择?
首先,我不确定我是否真的得到了将属性类型定义为IEntity
的想法-您确定Item
是另一个项目的所有者吗?一个Employee
是一个项目的所有者是可以的吗?
如果答案是肯定的,并且这是您系统的业务逻辑,那么就没有什么可做的了。
否则,您可能会发现定义IOwner
甚至OwnerBase
基类来帮助区分这种区别是有帮助的。
这也有助于区分哪些类需要缓存,哪些不需要缓存。
现在是关于缓存的问题:
第二级缓存的定义需要出现在两个地方:
1. 类的映射
2. 关联映射
在您的情况下,我相信您确实必须打开所有IEntity
类的第二级缓存。但是如果您只为特定的关联打开缓存,那么只有这些关联将被缓存。(一个例外是使用Get<T>()
或Load<T>()
方法,这也会导致对象被缓存。如果我没弄错的话,你可以告诉nHib not对特定查询使用缓存)