2011-09-14 11 views
4

私は初心者3.0と共通の過ちについて読んでされてのためにNHibernateはを読んされて(私が作ってそれらのいくつか)読み取り専用戦略

私は読み取り専用、1つまたは複数のレコードを作るためのいくつかの戦略が何であるか疑問に思って。今、私はすべての行を取得し、それらをループしてsession.Readonly()で読み取り専用にします。私は彼らが私はわからない何流暢

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

     // Mappings 
    } 
} 

で行うことを本の中で好きな

は、私は読み取り専用ではないために、これらのレコードが必要な場合は何が起こりますか?私にとってこれは、まったく同じマッピングから2行分のコードを差し引かなければならないということです。

私はこれを行い、ReadonlyEntityMapとEntityMapを持っていますが、すべての設定を2回複製する必要はありません。

誰でもどのようにこれを行うにはアイデアがありますか?読書専用の良いアイデアですか?

答えて

4

マッピングにReadOnly()を使用すると、オブジェクトのプロパティを変更したときにデータベースへの更新がすべて無効になります。

ReadOnlyとWriteable戦略を適用する場合は、Fluent Conventionとマーカーインターフェイスなどを使用することをお勧めします。

1つのプロパティだけで書き込みを無効にする場合は、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を作成することをお勧め。私が今持っているものまあ

+0

Readonlyはどのように設定されますか? – chobo2

+0

これはApp_StartなどでNHibernateを設定すると同時に適用されます。このwikiページの一番下を参照してください:http://wiki.fluentnhibernate.org/Conventions –

+0

しかし、このシナリオのもとに戻ったときに読み込み専用にしたいと言っているのですが、別のシナリオにしたいと思っています。読み込み専用ですか? – chobo2

1

これは達成しようとしている内容によって異なります。あなたはメモリ消費を最適化しようとしている場合は、あなたのセッション管理戦略を改善するか、あなたは、たとえばother performance improvement techniques.をすることができます使用することを検討すべきである:

  • クリアあなたのオブジェクトをロードしたセッションを、それが最初のレベルのキャッシュによって割り当てられたすべてのメモリを解放します。必要に応じて、後でオブジェクトを新しいセッションに再結合(マージ)することができます。この方法では、最初に読み込み専用にする必要はありません。

  • 不要になったオブジェクトの一部を削除します。これにより、他のオブジェクトが第1レベルのキャッシュに保持されます。

  • 第1レベルのキャッシュをまったく使用しないIStatelessSessionを使用してください。

また、答えはアプリケーションのアーキテクチャによって異なります。

+0

これです。私は1つ以上の行を戻します。これらの行は、(utcに格納されている)列の1つとしてdatetimesを持っています。私が結果を返すとすぐに人生を容易にするために、すべてのdatetimesはユーザーの現地時間に変換されます。 findメソッドを実行した後、ユーザーの現地時間と同じように、これらのレコードがどのタイムゾーンにあるかを考える必要はありません。しかし、nhibernateによれば、更新が発生しており、コミットが発生した場合、これらの時間はdbに保存され、すべてのdatetimesは乱されません。だから今、私はそれらのすべてをループして読み込み専用にします。 – chobo2

+0

セッションをクリアしたり、これらのオブジェクトをエビクトして、NHibernateセッションがこれ以上セッションを認識せず、これらのオブジェクトのデータベースを更新しようとしないようにすることができます。また、マッピングされていないフィールド/プロパティに変換された日付を格納することもできます。このようにして、NHibernateはそれについて知りませんし、オブジェクトを更新することも考慮しません。 – Dmitry

+0

うーん、それはオプションだと思う。追放されたものはまだ私は収集のすべてのオブジェクトをループする必要があります。これが私が止めようとしているものです。あなたは50個のオブジェクトを取り戻します。最初にする必要があることは、それぞれをループして、読み込み専用にするか何かを行うことです。 – chobo2

関連する問題