zoukankan      html  css  js  c++  java
  • Fluent NHibernate

       Id(p => p.Ticketcode).GeneratedBy.Assigned().UnsavedValue(null);//指定策略主键传进来 
      
    为什么要取代XML文件呢? 
    a.XML不是实时编译的。当你的XML配置文件有错误时,你只有在运行时才能看到哪里出错。 
    b.XML是非常繁琐的。的确在NHibernate中的配置文件,xml节点非常简单,但是仍然掩盖不了XML文件本身的繁琐性。 
    c.映射文件中重复的属性设置。比如在xml中我们需要设置每个string类型的字段都不允许为空,长度大于1000,int型都得有个默认值为-1,这样最终的xml配置文件你会发现有很多的重复工作。 
    Fluent NHibernate如何克服这些缺陷呢? 
    Fluent NHibernate把这些配置为文件都转化为了C#代码,这样可以让你的mapping直接在编译时就完成。 
      
    下面是传统的HBM XML mapping文件和Fluent NHibernate的对比。 
     
      
    Fluent NHibernate 的下载地址: http://github.com/jagregory/fluent-nhibernate 
      
     
      
     
      
       
      
     
      
      
     实战一 常用情况 
     
      
    建立的map映射 
        public  UserMap() 
            { 
                Table( " LoginUser " ); 
                Id(p => p.LoginId).Unique(); 

                References(p => p.LoginUserRank) 
                .LazyLoad() 
                .Not.Insert() 
                .Not.Update() 
                .NotFound.Ignore() 
                .Column( " RankId " ); 

                HasMany(p => p.LoginUserAddressList) 
                .AsSet() 
                .LazyLoad() 
                .Cascade.Delete().Inverse() 
                .NotFound.Ignore() 
                .KeyColumn( " LoginId " ); 

                HasManyToMany(p => p.DepartmentList) 
               .AsSet() 
               .LazyLoad() 
               .Cascade.Delete().Inverse() 
               .NotFound.Ignore().ParentKeyColumn( " LoginId " ).ChildKeyColumn( " DepartmentId " ) 
               .Table( " LoginUser_Department " ); 
            } 
      
      
      
     实战二 关系表中字段名不同 
       
        public  UserMap() 
            { 
                Table( " LoginUser " ); 
                Id(p => p.LoginId).UnsavedValue( " any " ); 

                References(p => p.LoginUserRank) 
                .LazyLoad() 
                .Not.Insert() 
                .Not.Update() 
                .NotFound.Ignore() 
                .Column( " RankCode " ); // 当前表中的那个字段跟 LoginUserRank表的主键关联  
                                     // 如果LoginUserRank表中的RankId非主键加上PropertyRef设置 

                HasMany(p => p.LoginUserAddressList) 
                    .AsSet() 
                    .LazyLoad() 
                    .Cascade.Delete().Inverse() // 由当前表维护关系 
                    .NotFound.Ignore() 
                    .KeyColumn( " LoginCode " ); // 当前表的主键跟LoginUserAddressList中的那个键相关联  
                                              // 如果不是当前表的主键跟LoginUserAddressList关联  加上PropertyRef设置 

                HasManyToMany(p => p.DepartmentList) 
                   .AsSet() 
                   .LazyLoad() 
                   .Cascade.Delete().Inverse() 
                   .NotFound.Ignore() 
                   .ParentKeyColumn( " LoginCode " ) // 当前表的主键跟LoginUser_Department中的那个键相关联  
                   .ChildKeyColumn( " DepartmentCode " ) // LoginUser_Department中的那个键跟Department的主键关联 
                   .Table( " LoginUser_Department " ); 

            } 
      
      
     实战三 关系表中字段名不同 并且关联字段非主键 
       
      
       Table( " LoginUser " ); 
                Id(p => p.LoginId).UnsavedValue( " any " ); 
                Map(p=>p.LoginCode); 


                References(p => p.LoginUserRank) 
                .Not.Insert() 
                .Not.Update() 
                .NotFound.Ignore() 
                .Column( " RankCode " ).PropertyRef( " RankCode " ); 

                HasMany(p => p.LoginUserAddressList) 
                    .AsSet() 
                    .LazyLoad() 
                    .Cascade.Delete().Inverse() // 由当前表维护关系 
                    .NotFound.Ignore() 
                    .KeyColumn( " LoginCode " ).PropertyRef( " LoginCode " ); 

                HasManyToMany(p => p.DepartmentList) 
                   .AsSet() 
                   .LazyLoad() 
                   .Cascade.Delete().Inverse() 
                   .NotFound.Ignore() 
                   .ParentKeyColumn( " LoginCode " ).PropertyRef( " LoginCode " ) 
                   .ChildKeyColumn( " DepartmentCode " ).ChildPropertyRef( " DepartmentCode " ) 
                   .Table( " LoginUser_Department " ); 
      
      
      
    子实体(Order)映射定义的东西就是父实体少了:与父实体关联的(多对一、一对多、多对多) 关系,并用一个指针来导航到父实体。 
    在“子”端通过many-to-one元素定义与“父”端的关联,从“子”端角度看这种关系模型是多对一关联(实际上是对Customer对象的引用)。下面看看many-to-one元素映射属性: 
     
    看看这些映射属性具体有什么意义: access(默认property):可选field、property、nosetter、ClassName值。NHibernate访问属性的策略。 cascade(可选):指明哪些操作会从父对象级联到关联的对象。可选all、save-update、delete、none值。除none之外其它将使指定的操作延伸到关联的(子)对象。 class(默认通过反射得到属性类型):关联类的名字。 column(默认属性名):列名。 fetch(默认select):可选select和join值,select:用单独的查询抓取关联;join:总是用外连接抓取关联。 foreign-key:外键名称,使用SchemaExport工具生成的名称。 index:...... update,insert(默认true):指定对应的字段是否包含在用于UPDATE或INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他特性得到或者通过触发器其他程序得到。 lazy:可选false和proxy值。是否延迟,不延迟还是使用代理延迟。 name:属性名称propertyName。 not-found:可选ignore和exception值。找不到忽略或者抛出异常。 not-null:可选true和false值。 outer-join:可选auto、true、false值。 property-ref(可选):指定关联类的一个属性名称,这个属性会和外键相对应。如果没有指定,会使用对方关联类的主键。这个属性通常在遗留的数据库系统使用,可能有外键指向对方关联表的某个非主键字段(但是应该是一个唯一关键字)的情况下,是非常不好的关系模型。比如说,假设Customer类有唯一的CustomerId,它并不是主键。这一点在NHibernate源码中有了充分的体验。 unique:可选true和false值。控制NHibernate通过SchemaExport工具生成DDL的过程。 unique-key(可选):使用DDL为外键字段生成一个唯一约束。 
    我们来建立“子”端到“父”端的映射,新建Order.hbm.xml文件,编写代码如下:
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                       assembly="DomainModel" namespace="DomainModel">
      
      <class name="DomainModel.Entities.Order,DomainModel" table="`Order`" >
        <id name="OrderId" column="OrderId" type="Int32" unsaved-value="0">
          <generator class="native" />
        </id>
        <property name="OrderDate" column="OrderDate" type="DateTime"
                  not-null="true" />
        <!--多对一关系:Orders属于一个Customer-->
        <many-to-one name="Customer" column="Customer" not-null="true"
                     class="DomainModel.Entities.Customer,DomainModel"
                     foreign-key="FK_CustomerOrders" />
      </class>
    </hibernate-mapping>
  • 相关阅读:
    lightoj 1094 Farthest Nodes in a Tree 【树的直径 裸题】
    nyoj 1185 最大最小值【线段树最大值最小值维护】
    nyoj 123 士兵杀敌(四) 树状数组【单点查询+区间修改】
    poj 3468 A Simple Problem with Integers【线段树区间修改】
    hdoj 1698 Just a Hook【线段树区间修改】
    hdoj 1556 Color the ball【线段树区间更新】
    hdoj 1286 找新朋友【欧拉函数】
    [LC] 303. Range Sum Query
    [LC] 79. Word Search
    [LC] 211. Add and Search Word
  • 原文地址:https://www.cnblogs.com/wangyhua/p/4050540.html
Copyright © 2011-2022 走看看