NHibernate文書翻訳第9章はAttributes NHibernete.Mapping.Attributesを使用します.

8380 ワード

第9章Attributes NHibernete.Mapping.Attributesを使用する
目次
どう使いますか
ヒント
既知の問題とTODOs
開発者心得
何がNHibernate.Mapping.Attributesですか?
NHibernate.Mappingn.AttributesはNHibernateの付加ソフトウェアで、それはPierre Henri Kuaut(aka KPixel)が貢献したのです.以前の実装者はJohn Morris.NHiberneteがマッピング情報を必要として、あなたのドメインオブジェクトをデータベースに結びつけます.彼らは一般的に(そして保存されている)分散hbm.xmlファイルに書かれています.
NHibernete.Mapping.Attributesを使用して、NETプロパティを使用して、あなたのエンティティを修飾し、生成に使用されます.hbm.xmlマッピング(ファイルまたはストリーム)のプロパティ(atributes).ですから、これらの嫌な書類に悩まされなくなります.
このライブラリには内容が含まれています.
  • NHibernete.Mappings.Attributes:あなたが必要とする唯一のプロジェクト(最終ユーザーとして)
  • Test:属性(atributes)とHbmSerializerを使用する簡単な使用例は、NUnitのTestFixture
  • である.
  • Generator:プロパティとHbmWriterを生成するためのプログラムです.
  • Refly:ありがとうございます.ジョナサンのHallouxはこのライブラリを提供してくれて、コードを作るのがこんなに簡単になりました.
  • 重要なヒント
    このライブラリはファイル/src/NHibernate.Mapping.Attributes/nhibernate-mapping-2.0.xsdを使用して生成されたXMLフローの正当性を確認するためにプログラムセットに埋め込まれています.このファイルはNHibernateが新しいバージョンをリリースするたびに変更される可能性がありますので、異なるバージョンで使用するべきです.それを再生成します.0.8前のバージョンではテストに合格しませんでした.
    どう使いますか
    最終ユーザクラスはNHibernate.Mapping.Attributes.HbmSerializerです.このクラスのプロローグは、あなたのドメインモデルをマッピングストリームに配置します.プログレッシブプログラムのクラスを逐次配置してもいいです.NHibernate.Mapping.Attributes.Testを参照してください.
    第一歩は属性で本体を修飾します.[Class][Subclass][JoinedSubclass]、または[Component]を使ってもいいです.そして、メンバーを修飾します.これらは、多くのマッピングにおいて必要とされる属性、例えば、
        [NHibernate.Mapping.Attributes.Class]
    
        public class Example
    
        {
    
            [NHibernate.Mapping.Attributes.Property]
    
            public string Name;
    
        }
    このステップを完了したら、NHibernate.Mapping.Attributes.HbmSerializerを使用します.
        System.IO.MemoryStream stream = new System.IO.MemoryStream(); // where the xml will be written
    
        NHibernate.Mapping.Attributes.HbmSerializer.Default.Validate = true; // Enable validation (  )
    
        // Here, we serialize all decorated classes (but you can also do it class by class)
    
        NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
    
            stream, System.Reflection.Assembly.GetExecutingAssembly() );
    
        stream.Position = 0; // Rewind
    
        NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
    
        cfg.Configure();
    
        cfg.AddInputStream(stream); // Use the stream here
    
        stream.Close();
    
        // Now you can use this configuration to build your SessionFactory...
    注意
    あなたが見た通りです
    NHibernnate.Mappings.Attributesは侵入性がないです.対象に属性を設定して、NHiberneteでそれらを使うように強制することはありません.また、あなたのアーキテクチャの制約を破壊することはありません.属性は純粋な情報だけです.
    ヒント
  • は、HbmSerializer.Validateを使用して、生成されたxmlストリームの適法性検査を有効/無効にする(NHibernate mapping schemaに依存する).迅速な検索問題には(StringBuiderによってHbmSerializer.Errorに書き込まれています.)このライブラリが予期している場合、ライブラリは既知の問題であるかどうかを見て報告します.これらの問題を解決することはあなたの解決策を完成するのに役立ちます.
  • クラス、フィールドと属性のproperties(メンバー)はプライベートであっても良いです.反射を使ってプライベートメンバにアクセスする権限があることを確認してください.
  • マッピングクラスのメンバーもベースクラスで検索されます.したがって、ベースクラス(マッピングされていない)でメンバーを修飾して、サブクラスで使用してもいいです.
  • タイプ(ReflectionPermissionFlag.MemberAccess)のNameに対して、Name="xxx"(stringとして)を使って種類を設定したり、NameTypeof=typeof(xxx)を設定したりします.(「Name」に「タイプ」を追加)
  • デフォルトの場合、NET属性は属性を維持していません.したがって、順序を自分で設定しなければなりません.管理手順において(各属性の最初のパラメータを使用して)、強く設定してください.メンバーが一つ以上の属性を持っているとき.
  • あいまいさがない限り、多くのインコヒーレント属性をメンバーに定義することができます.良い例としては、識別子メンバーのクラス記述(class-related)属性(同様の識別器System.Type)があります.管理順序を忘れないでください.の順番です.個人的には、負の値を属性に使うのが好きです.
  • クラスに<discriminator>を追加して<discriminator>属性を指定してもいいです.(クラスがシーケンス化されたときに使用します.)<id>属性も使用できます.
  • は識別器値([HibernateMapping])として文字列を使用しない(<hibernate-mapping>HbmSerializer.Hbm*).必要なオブジェクトを任意に使ってもいいです.例:
    [Subclass(DiscriminatorValueEnumFormat="d", DiscriminatorValueObject=DiscEnum.Val1)]
    はここにあります.オブジェクトは列挙しています.必要なフォーマット(デフォルトの値はg)を設定してもいいです.前に置いてください.他のタイプについては、オブジェクトを簡単に使用した[HibernateMapping]方法のみである.
  • もしあなたがDiscriminatorValueタイプのメンバー(ライブラリNullables)を使用すると、システムは[Class]に自動的にマッピングされる.[Subclass]ToString()をセットしなくてもいいです.ミハエル・スリルのアイデアに感謝します.
  • NHibernate.Mappingn.Attributesによって生成される各ストリームには、日付が生成される注釈がある.これを有効/無効にする方法Nullables.NullableXXXがあります.
  • 必要なxml属性を提供することを忘れた場合、システムはマッピングを作成する際に異常を投げます.
  • マッピングNullables.NHibernate.NullableXXXTypeの時に、推薦され、最も簡単な方法は[Property]を使用することである.まず、Type="..."を配置してコンポーネントクラスにおいて、そのフィールド/属性をマッピングする.WriteDateCommentに名前を設定しないように注意する.そして、あなたのクラスの各メンバーに[Component]を追加する.ただし、各メンバーのアクセスを変更することはできない([ComponentProperty]).更新([Component])または挿入([Component])NHibernate.Mapping.Attributes.Testには一例があります.最後のことに注意してください.[ComponentProperty]Accessから継承されています.Update元素の後ろに書いて、XMLフローにあります.
  • の別のマッピングInsertは、このような方法でライブラリを動作させる.1つのクラスが1つのコンポーネントマッピングを含む場合、このコンポーネントはクラスに含まれます.NHibernete.Mapping.Attributes.TestはCompAddressComponentPropertyAttributeのアドレス(DynamicComponentAttribute)コンポーネントを使用する例を含みます.簡単に、後で
    [Component(Name = "MyComp")] private class SubComp : Comp {}
    を追加します.1つの利点は、各メンバーのアクセスを変更することができる(<component>)、更新する([Component])、または挿入する(JoinedBaz).しかし、各クラスにコンポーネントのサブクラスを追加しなければならない(引き継ぎはできない).
  • カスタムについて.Stuffは、Addressを使用して様々な属性をプロビジョニングする.彼の方法は虚である.したがって、サブクラスを作成して、任意の方法を書き換えることができます.属性Accessを使用して、書き込みの実施形態を変更する.(Updateのサブクラスを設定してもいいです.)
  • 一部ヒントを使用した例:(0,1,2は順番に並べます)
        [NHibernate.Mapping.Attributes.Id(0, TypeType=typeof(int))] // Don't put it after [ManyToOne] !!!
    
            [NHibernate.Mapping.Attributes.Generator(1, Class="uuid.hex")]
    
        [NHibernate.Mapping.Attributes.ManyToOne(2, ClassType=typeof(Foo), OuterJoin=OuterJoinStrategy.True)]
    
        private Foo Entity;
    
    
    生成:
        <id type="Int32">
    
            <generator class="uuid.hex" />
    
        </id>
    
        <many-to-one name="Entity" class="Namespaces.Foo, SampleAssembly" outer-join="true" />
    
    
    既知の問題とTODOs
    まず、ソースコードのTODOsを読みます.Insert属性(property)は、すべての属性(atributes)に追加され、彼らに並べ替えられます.まだ問題があります.
    親要素の「p」にサブ要素の「x」がある場合、他のサブ要素の「c」にはサブ要素の「x」があります.Dは図のとおりである
        <p>
    
            <c>
    
                <x />
    
            </c>
    
            <x />
    
        </p>
    
    
    この例では、こう書けば、
        [Attributes.P(0)]
    
            [Attributes.C(1)]
    
                [Attributes.X(2)]
    
            [Attributes.X(3)]
    
        public MyType MyProperty;
    X(3)はC(1)!(X(2)と同じ)
    以下はHbmSerializerHbmWriterの場合である.
    もう一つの悪いメッセージは、現在、その後加入されたXML要素が含まれていないということです.例えば、HbmSerializer.HbmWriterにセットを置くことはできません.HbmWriterファイルはプログラム要素がどのように作成されたかを教えてくれます.どの順番で作成されますか?そしてNHibernate.Mapping.Attributesはこの順序でそれらを使います.
    つまり、解決策は全体型のパーティノード属性をBaseAttributeに追加してください.そうすると、あなたは真実な状況を作ることができます.
    実際には、他の知識もないし、計画された修正もないです.このライブラリは安定したバージョンになります.しかし、問題を発見しました.あるいは効果的な改善の考えがあります.
    もう一つのメッセージは、NHibernate.Mapping.Attributes.Testより良いTest Fixture.Dがありますように.
    開発者心得
    schema(Position)の任意の変更は、
  • Generatorで何か変更があるかどうかをチェックします.(udating KnowEnums/AllowMultileValue/IsRoot/IsSystemType/IsSystem Enum/CanContinItself)
  • は、<dynamic-component>を更新し(コピー/貼り付け)、再度Generatorを実行します.
  • 試験項目を実行し、既知の異常がないと判断し、変更による破壊を把握できるようにすることができる場合、この項目のうちの1つのクラス/属性(=>hbm.xmlファイルおよび/または<nested-composite-element>プロジェクトの参照を更新する)
  • を修正/追加します.
    この実現はNHibernate mapping schemaに基づいています.多くの「標準schema特性」がサポートされていない可能性があります.
    このバージョンのNHibernate.Mappingn.AttributesはNHibernateライブラリのバージョンのschemaを使用して生成する必要があります.
    このプロジェクトの設計は、性能が小さい目標であり、実現と維持が重要である.