我有~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个类的缓存,我不能只缓存我想要的类,比如类别。
有没有人知道如何映射具有属性的实体,该属性是抽象实体的类型而不会失去进行二级缓存选择的能力?
答案 0 :(得分:1)
首先,我不确定我是否真的想到将属性类型定义为IEntity
- 你确定Item
可以成为另一个项目的所有者吗? Employee
是否可以成为项目的所有者?
如果答案是肯定的,那就是你的系统的业务逻辑,那么就没有什么可做的了
否则 - 您可能会发现定义IOwner
甚至OwnerBase
基类来帮助区分这一点很有帮助。
这对于指定哪些类进行缓存以及哪些不进行缓存也可能有所帮助。
现在谈到缓存问题:
二级缓存的定义需要在两个地方进行:
1.班级的映射
2.关联映射
在您的情况下,我相信您确实必须为所有IEntity
类启用二级缓存。 但是如果您只打开特定关联的缓存,那么只会缓存这些关联。
(例外情况是使用Get<T>()
或Load<T>()
方法,这也会导致您的对象被缓存。如果我没有记错,您可以告诉nHib 不使用缓存进行特定查询)