标签:style blog class code c java
[NHibernate]持久化类(Persistent Classes)
[NHibernate]集合类(Collections)映射
[NHibernate]缓存(NHibernate.Caches)
NHibernate.Mapping.Attributes是NHibernate的附加软件,它是Pierre Henri Kuat(aka KPixel)贡献的;以前的实现者是John Morris.NHibernate需要映射信息来绑定你的域对象到数据库。通常他们被写在(并且被保存在)分散的hbm.xml文件里。
使用NHibernate.Mapping.Attributes,你可以使用.NET属性(attributes)来修饰你的实体和被用于产生.hbm.xml映射(文件或者流)的属性(attributes).因此,你将不再会为这些令人烟雾的文件而烦恼。
这个库里面的内容包括:
重要提示
这个库是使用文件/src/NHibernate.Mapping.Attributes/nhibernate-mapping-2.0.xsd(它嵌入在程序集中能检查产生的xml流的合法性)产生的,这个文件可能在NHibernate每次发布新版本时发生变化,所以你应该在不同的版本中使用它时,重新生成它(打开Generator工程,编译并且运行Generator项目)。但是,在0.8之前的版本中它并没有通过测试。
最终用户类
是NHibernate.Mapping.Attributes.HbmSerializer.这个类序列化你的域模型到映射流.你可以逐个序列化程序集中的类.NHibernate.Mapping.Attributes.Test可以作为参考.
第一步用属性(attributes)修饰你的实体;你可以用 [Class], [Subclass],
[JoinedSubclass]或者[Component].然后,修饰成员(字段/属性properties);它们能够代替很多映射中需要使用的属性(attributes
),例如:
1 [NHibernate.Mapping.Attributes.Class] 2 public class Example 3 { 4 [NHibernate.Mapping.Attributes.Property] 5 public string Name; 6 }
完成这个步骤后,使用NHibernate.Mapping.Attributes.HbmSerializer:(这里我们使用了Default ,它是一个实例,在你不必须/不想自己创建它时使用).
1 System.IO.MemoryStream stream = new System.IO.MemoryStream(); // where the xml will be written 2 NHibernate.Mapping.Attributes.HbmSerializer.Default.Validate = true; // Enable validation (可选) 3 // Here, we serialize all decorated classes (but you can also do it class by class) 4 NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize( 5 stream, System.Reflection.Assembly.GetExecutingAssembly() ); 6 stream.Position = 0; // Rewind 7 NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration(); 8 cfg.Configure(); 9 cfg.AddInputStream(stream); // Use the stream here 10 stream.Close(); 11 // Now you can use this configuration to build your SessionFactory...
注意:正如你所见:NHibernate.Mapping.Attributes是没有(真正的)侵入性的.在你的对象上设置属性(attributes ),不会强迫你在NHibernate 使用它们,并且不会破坏你的架构体系中的任何约束.属性(Attributes)仅仅是纯粹的信息.
在这里,对象是一个枚举,你可以设置你需要的格式(默认的值是"g").注意你必须把它放在前面!对于其他的类型,只是简单的使用了对象的ToString()方法.
首先,放置[Component]在组件类并且映射它的字段/属性.注意不要在[Component]设置名字.然后,在你的类的每个成员,添加[ComponentProperty].但是你不能改变每个成员的存取(Access),更新(Update)或插入(Insert).
在NHibernate.Mapping.Attributes.Test里有一个例子(注意CompAddress类和他在其他类中的使用).
注意最后一件事情:ComponentPropertyAttribute是从DynamicComponentAttribute继承来的,容易把它紧接着写在
<component>元素的后面,在XML流中.
使用属性(property)HbmSerializer.HbmWriter来改变写的实现者。(你可以设置一个HbmWriter的子类)。使用了部分提示的例子:(0,1和2按顺序排列)
1 [NHibernate.Mapping.Attributes.Id(0, TypeType=typeof(int))] // Don‘t put it after [ManyToOne] !!! 2 [NHibernate.Mapping.Attributes.Generator(1, Class="uuid.hex")] 3 [NHibernate.Mapping.Attributes.ManyToOne(2, ClassType=typeof(Foo), OuterJoin=OuterJoinStrategy.True)] 4 private Foo Entity;
产生的:
1 <id type="Int32"> 2 <generator class="uuid.hex" /> 3 </id> 4 <many-to-one name="Entity" class="Namespaces.Foo, SampleAssembly" outer-join="true" />
首先,阅读源代码里面的TODOs
Position属性(property)被加在所有属性(attributes)上,用来给他们排序。但是仍然有问题:
当一个父元素"p"有一个子元素"x",它的另一个子元素"c"有子元素"x"。:D 如
1 <p> 2 <c> 3 <x /> 4 </c> 5 <x /> 6 </p>
在这个例子中,如果这样写:
1 [Attributes.P(0)] 2 [Attributes.C(1)] 3 [Attributes.X(2)] 4 [Attributes.X(3)] 5 public MyType MyProperty;
X(3)将会属于C(1)!(和X(2)一样)
下面是<dynamic-component>和<nested-composite-element>的情况。
另一个坏消息是,现在,后来加入的XML元素不能被包含.例如:没有办法在<dynamic-component>放置集合.原因是nhibernate-mapping-2.0.xsd文件告诉程序元素怎么被创建,按照什么顺序被创建,并且NHibernate.Mapping.Attributes按这个顺序使用它们.
总之,解决方案应该添加整型的ParentNode属性(property)给BaseAttribute,这样你能够创建一个真实的情况...
实际上,没有其他的知识点了而且也没有计划好的修改.这个库将会成为稳定的完整版本;但是你发现了问题或者有有效的改进想法,请联系我们!
另一个消息,希望有比NHibernate.Mapping.Attributes.Test更好的TestFixture.:D
schema (nhibernate-mapping-2.0.xsd)的任何改变意味着:
这个实现基于NHibernate mapping
schema;有可能很多"标准schema特性"没有被支持...
这个版本的NHibernate.Mapping.Attributes需要使用NHibernate库的版本的schema来产生.
这个项目的设计,性能是一个(十分)小的目标,实现和维护则要重要许多.
本文来自《NHibernate 中文文档》
[NHibernate]使用AttributeNHibernate.Mapping.Attributes,布布扣,bubuko.com
[NHibernate]使用AttributeNHibernate.Mapping.Attributes
标签:style blog class code c java
原文地址:http://www.cnblogs.com/wolf-sun/p/3733929.html