[NHibernate]使用AttributeNHibernate.Mapping.Attributes

时间:2014-05-18 02:38:01   收藏:0   阅读:394

系列文章

[Nhibernate]体系结构

[NHibernate]ISessionFactory配置

[NHibernate]持久化类(Persistent Classes)

[NHibernate]O/R Mapping基础

[NHibernate]集合类(Collections)映射 

[NHibernate]关联映射

[NHibernate]Parent/Child

[NHibernate]缓存(NHibernate.Caches)

什么是NHibernate.Mapping.Attributes?

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 ,它是一个实例,在你不必须/不想自己创建它时使用).

bubuko.com,布布扣
 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...
bubuko.com,布布扣

注意:正如你所见: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

首先,阅读源代码里面的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

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!