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はこのライブラリを提供してくれて、コードを作るのがこんなに簡単になりました. 重要なヒント
このライブラリはファイル
どう使いますか
最終ユーザクラスは
第一歩は属性で本体を修飾します.
あなたが見た通りです
NHibernnate.Mappings.Attributesは侵入性がないです.対象に属性を設定して、NHiberneteでそれらを使うように強制することはありません.また、あなたのアーキテクチャの制約を破壊することはありません.属性は純粋な情報だけです.
ヒントは、 クラス、フィールドと属性のproperties(メンバー)はプライベートであっても良いです.反射を使ってプライベートメンバにアクセスする権限があることを確認してください. マッピングクラスのメンバーもベースクラスで検索されます.したがって、ベースクラス(マッピングされていない)でメンバーを修飾して、サブクラスで使用してもいいです. タイプ( デフォルトの場合、NET属性は属性を維持していません.したがって、順序を自分で設定しなければなりません.管理手順において(各属性の最初のパラメータを使用して)、強く設定してください.メンバーが一つ以上の属性を持っているとき. あいまいさがない限り、多くのインコヒーレント属性をメンバーに定義することができます.良い例としては、識別子メンバーのクラス記述(class-related)属性(同様の識別器 クラスに は識別器値( もしあなたが NHibernate.Mappingn.Attributesによって生成される各ストリームには、日付が生成される注釈がある.これを有効/無効にする方法 必要なxml属性を提供することを忘れた場合、システムはマッピングを作成する際に異常を投げます. マッピング の別のマッピング カスタムについて. 一部ヒントを使用した例:(0,1,2は順番に並べます)
まず、ソースコードのTODOsを読みます.
親要素の「p」にサブ要素の「x」がある場合、他のサブ要素の「c」にはサブ要素の「x」があります.Dは図のとおりである
以下は
もう一つの悪いメッセージは、現在、その後加入されたXML要素が含まれていないということです.例えば、
つまり、解決策は全体型のパーティノード属性をBaseAttributeに追加してください.そうすると、あなたは真実な状況を作ることができます.
実際には、他の知識もないし、計画された修正もないです.このライブラリは安定したバージョンになります.しかし、問題を発見しました.あるいは効果的な改善の考えがあります.
もう一つのメッセージは、NHibernate.Mapping.Attributes.Testより良いTest Fixture.Dがありますように.
開発者心得
schema( Generatorで何か変更があるかどうかをチェックします.(udating KnowEnums/AllowMultileValue/IsRoot/IsSystemType/IsSystem Enum/CanContinItself) は、 試験項目を実行し、既知の異常がないと判断し、変更による破壊を把握できるようにすることができる場合、この項目のうちの1つのクラス/属性(=>hbm.xmlファイルおよび/または を修正/追加します.
この実現はNHibernate mapping schemaに基づいています.多くの「標準schema特性」がサポートされていない可能性があります.
このバージョンのNHibernate.Mappingn.AttributesはNHibernateライブラリのバージョンのschemaを使用して生成する必要があります.
このプロジェクトの設計は、性能が小さい目標であり、実現と維持が重要である.
目次
どう使いますか
ヒント
既知の問題と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).ですから、これらの嫌な書類に悩まされなくなります.
このライブラリには内容が含まれています.
このライブラリはファイル
/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
に書き込まれています.)このライブラリが予期している場合、ライブラリは既知の問題であるかどうかを見て報告します.これらの問題を解決することはあなたの解決策を完成するのに役立ちます.ReflectionPermissionFlag.MemberAccess
)のNameに対して、Name="xxx"(stringとして)を使って種類を設定したり、NameTypeof=typeof(xxx)を設定したりします.(「Name」に「タイプ」を追加)System.Type
)があります.管理順序を忘れないでください.の順番です.個人的には、負の値を属性に使うのが好きです.<discriminator>
を追加して<discriminator>
属性を指定してもいいです.(クラスがシーケンス化されたときに使用します.)<id>
属性も使用できます.[HibernateMapping]
)として文字列を使用しない(<hibernate-mapping>
とHbmSerializer.Hbm*
).必要なオブジェクトを任意に使ってもいいです.例:[Subclass(DiscriminatorValueEnumFormat="d", DiscriminatorValueObject=DiscEnum.Val1)]
はここにあります.オブジェクトは列挙しています.必要なフォーマット(デフォルトの値はg)を設定してもいいです.前に置いてください.他のタイプについては、オブジェクトを簡単に使用した[HibernateMapping]
方法のみである.DiscriminatorValue
タイプのメンバー(ライブラリNullables)を使用すると、システムは[Class]
に自動的にマッピングされる.[Subclass]
にToString()
をセットしなくてもいいです.ミハエル・スリルのアイデアに感謝します.Nullables.NullableXXX
があります.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はCompAddress
とComponentPropertyAttribute
のアドレス(DynamicComponentAttribute
)コンポーネントを使用する例を含みます.簡単に、後で[Component(Name = "MyComp")] private class SubComp : Comp {}
を追加します.1つの利点は、各メンバーのアクセスを変更することができる(<component>
)、更新する([Component]
)、または挿入する(JoinedBaz
).しかし、各クラスにコンポーネントのサブクラスを追加しなければならない(引き継ぎはできない).Stuff
は、Address
を使用して様々な属性をプロビジョニングする.彼の方法は虚である.したがって、サブクラスを作成して、任意の方法を書き換えることができます.属性Access
を使用して、書き込みの実施形態を変更する.(Update
のサブクラスを設定してもいいです.) [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)と同じ)以下は
HbmSerializer
とHbmWriter
の場合である.もう一つの悪いメッセージは、現在、その後加入されたXML要素が含まれていないということです.例えば、
HbmSerializer.HbmWriter
にセットを置くことはできません.HbmWriter
ファイルはプログラム要素がどのように作成されたかを教えてくれます.どの順番で作成されますか?そしてNHibernate.Mapping.Attributesはこの順序でそれらを使います.つまり、解決策は全体型のパーティノード属性をBaseAttributeに追加してください.そうすると、あなたは真実な状況を作ることができます.
実際には、他の知識もないし、計画された修正もないです.このライブラリは安定したバージョンになります.しかし、問題を発見しました.あるいは効果的な改善の考えがあります.
もう一つのメッセージは、NHibernate.Mapping.Attributes.Testより良いTest Fixture.Dがありますように.
開発者心得
schema(
Position
)の任意の変更は、<dynamic-component>
を更新し(コピー/貼り付け)、再度Generatorを実行します.<nested-composite-element>
プロジェクトの参照を更新する)この実現はNHibernate mapping schemaに基づいています.多くの「標準schema特性」がサポートされていない可能性があります.
このバージョンのNHibernate.Mappingn.AttributesはNHibernateライブラリのバージョンのschemaを使用して生成する必要があります.
このプロジェクトの設計は、性能が小さい目標であり、実現と維持が重要である.