2011-09-14 212 views
4

我一直在读初学者3.0 NHibernate和在阅读有关常犯的错误(他们几个我一直做的),只读策略与NHibernate和功能NHibernate

我想知道什么方法让一个或多个记录只读一些策略。现在我得到所有的行并通过它们循环,使它们只读session.Readonly()。

我喜欢他们用流利的

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

     // Mappings 
    } 
} 

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

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

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

回答

4

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

如果你想应用某种只读和可写策略,我会建议使用Fluent Convention和标记接口或类似的。

如果您想禁止只写入一个属性,您也可以将ReadOnly()应用于属性。我使用该技术来避免回写到SQL Server中的计算列。

事情是这样的:

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其执行转换到用户的时间,而无需修改基础数据。

+0

Readonly如何设置? – chobo2

+0

它会在App_Start或其他配置中同时应用NHibernate。看到这个维基页面的底部:http://wiki.fluentnhibernate.org/Conventions –

+0

但我怎么告诉它,我希望它是只读的,当我回到这种情况下与另一种情况下,我不希望它只读吗? – chobo2

1

这取决于你想达到的目标。如果你正在设法优化内存消耗,你应该考虑提高你的会话管理策略或使用other performance improvement techniques.例如,您可以:

  • 清除该加载你的对象,它会释放由第一级高速缓存分配的所有内存会话。如果需要,以后可以将这些对象重新连接(合并)为新的会话。这样你就不需要首先读取对象。

  • 当你不再需要它们时,驱逐一些物体。这将使其他对象保持在一级缓存中。

  • 使用IStatelessSession根本不使用1级缓存。

此外,答案取决于您的应用程序体系结构。

+0

那么我有什么,现在是这样的。我得到一个或多个行。这些行具有日期时间作为列中的一个(存储在utc中)。为了让生活变得容易,只要我得到结果,所有日期时间都会转换为用户本地时间。 find方法完成后,您不必考虑这些记录所在的时区,因为它是用户本地时间。然而,根据nhibernate发生更新,如果发生提交,这些时间会被保存回分贝,并且所有的日期时间都不会混淆。所以现在我循环所有这些,并让它们只读。 – chobo2

+0

您可以清除会话或驱逐这些对象,以便NHibernate会话不再了解它们,并且不会尝试为这些对象更新数据库。或者,您可以将转换后的日期存储在未映射的字段/属性中。这样NHibernate甚至不会知道它,并且不会考虑要更新的对象。 – Dmitry

+0

嗯我想这是一个选项。驱逐的东西仍然是我必须循环收集中的所有对象。这就是我想要阻止的。有点吮吸你回来50个对象,你必须做的第一件事是循环每一个并驱逐或使它们只读或任何其他 – chobo2