Nhibernate和Fluent Nhibernate的Readonly策略

时间:2011-09-14 16:57:29

标签: nhibernate fluent-nhibernate

我一直在为初学者3.0阅读nhibernate,并一直在阅读常见错误(其中一些我一直在制作)

我想知道什么是只读一个或多个记录的策略。现在我将所有行返回并循环遍历它们通过session.Readonly()进行读取。

我喜欢他们用流利的方式做的书

class EntityMap : ClassMap<Entity>
{
    public EntityMap()
    {
        SchemaAction.None();
        ReadOnly();

        // Mappings
    }
 }

如果我需要这些记录不是Readonly,我不确定会发生什么?对我来说,这意味着我必须使这个完全相同的映射减去那两行代码。

所以我想这样做并拥有ReadonlyEntityMap和EntityMap,但我不必重复所有设置两次。

任何人都有关于如何做到这一点的想法?或者只读更好的想法?

2 个答案:

答案 0 :(得分:4)

在映射上使用ReadOnly()将在修改对象的属性时禁用任何更新回数据库。

如果您想应用某种ReadOnly和Writeable策略,我建议您使用Fluent Convention和标记界面或类似方法。

如果要仅对该属性禁用写入,也可以将ReadOnly()应用于属性。我使用该技术避免写回SQL Server中的Computed Columns。

这样的事情:

public interface IReadOnly{} //Mark entities with this interface

public class ReadOnlyConvention
     : IClassConvention, IClassConventionAcceptance<IClassInspector>
{
  public void Accept(IAcceptanceCriteria<IClassInspector> criteria)
  {
    criteria.Expect(x => x.EntityType Is IReadOnly);
  }

  public void Apply(IClassInstance instance)
  {
    instance.ReadOnly();
  }
}

更新: 如果你想做转换时间,我会建议为你的DateTime对象创建一个IUserType,它可以转换为用户时间而无需修改基础数据。

答案 1 :(得分:1)

这取决于你想要达到的目标。如果您尝试优化内存消耗,则应考虑改进会话管理策略或使用other performance improvement techniques.例如:

  • 清除加载对象的会话,它将释放第一级缓存分配的所有内存。如果需要,稍后可以将对象重新附加(合并)到新会话。这样,您首先不需要只读对象。

  • 当您不再需要它们时,撤消一些对象。这将使其他对象保持在第一级缓存中。

  • 使用完全不使用第一级缓存的IStatelessSession

同样,答案取决于您的应用程序架构。