`

Gentle.NET Users' Guide

阅读更多

------------------------------------------------------------
用户指南 - Gentle.NET 概述
------------------------------------------------------------
1. 什么是持续框架(PersisitenceFramework)?
    将对象映射到关系数据库的一种快速开发框架
    理论背景,可参考
        ·持续化思想http://www.ambysoft.com/downloads/persistenceLayer.pdf
        ·OR映射:http://www.agiledata.org/essays/impedanceMismatch.html
        ·NULL值处理:
    附加信息
        ·微软进行持续框架研究(ObjectSpaces)已经好几年了,但很不幸的是,它被无限期延后了(最新的消息是在Loghorn服务器在2007年发布时,它将随WinFS一起被提供)
        ·然而,关于持续框架是什么,为什么你需要使用它,微软提供了比较有用的背景信息,可以参看http://www.15seconds.com/issue/040112.htm
2. Gentle概述
    ·metadata(attributes and database schema analysis)
    ·business object(base classes and interfaces)
    ·architecture (framework and database access)
    ·encapsulating parameters (criteria and object identifiers)
    ·custom queries
    ·query results(and object construction)
    ·presentation (custom dataview generation)
    ·transactions

3. 使用 Gentle.NET
3.1 基本例程
    using Gentle.Framework;

    [TableName("Users")]
    public class User : Persistent
    {
        private int userId;
        private string userName;
        // this is used by clients to construct new users
        public User( string userName ) : this( 0, userName ) {}
        // this is used by Gentle to reconstruct objects read from the database
        public User( int userId, string userName )
        {
            this.userId = userId;
            this.userName = userName;
        }
        [TableColumn("UserId"), PrimaryKey(AutoGenerated=true)]
        public int Id
        {
            get{ return userId; }
            set{ userId = value; }
        }
        [TableColumn(NotNull=true)]
        public string Name
        {
            get{ return userName; }
            set{ userName = value; }
        }

        //----------------------------------------------------------       
        // this is used by client to fetch users from the database
        static public User Retrieve( int userId )
        {
            Key key = new Key( typeof(User), true, "Id", userId );
            return Broker.RetrieveInstance( typeof(User), key ) as User;
        }
    }

    User user = new User( 42, "Ford Prefect" );
    Broker.Insert( user ); // 把user对象保存到数据库
    Key key = new Key( typeof(User), true, "Id", 42 ); // 使用单项选择限制条件值来创建关键字(create a key with a single selection criteria value)
    user = Broker.RetrieveInstance( typeof(User), key ) as User; // 重数据库获取指定user对象(load the specified user from the database)

    // 若User继承至Persistent,可以简化为:
    User ford = new User( "Ford Prefect" );
    ford.Persist(); // 保存新user并分配了id
    User prefect = User.Retrieve( ford.Id ); // 获取指定user

 

3.2 获取列表
    获取所有user对象实例
        static public IList ListAll
        {
            get{ return Broker.RetrieveList( typeof(User) ); }
        }
    定制查询
        static public IList ListByNameStartsWith( string partialName )
        {
            SqlBuilder sb = new SqlBuilder( StatementType.Select, typeof(User) );
            // note: the partialName parameter must also contain the %'s for the LIKE query!
            sb.AddConstraint( Operator.Like, "Name", partialName );
            // passing true indicates that we'd like a list of elements, i.e. that no primary key
            // constraints from the type being retrieved should be added to the statement
            SqlStatement stmt = sb.GetStatement( true );
            // execute the statement/query and create a collection of User instances from the result set
            return ObjectFactory.GetCollection( typeof(User), stmt.Execute() );
        }

3.3 用GentleList来处理关联
    GentleList继承至从ArrayList,与普通的list很相似,并添加了持续化保存得特性.
    它支持以下类型的关联: StandAlone, OneToMany, ManyToMany
        ·standAlone
            GentleList list = new GentleList( typeof(User) );
        ·OneToMany
            GentleList list = new GentleList( typeof(User), parentInstance );
        ·ManyToMany
            GentleList list = new GentleList( typeof(User), role, typeof(UserRole) );


3.4 关联
    获取与account相关联的account对象列表
    public IList Accounts
    {
        get{ return RetrieveList( typeof(Account), "Id" ); }
    }

    外键关联
    [TableColumn("SubscriberId"), PrimaryKey, ForeignKey("User","UserId")]
    public int SubscriberId
    {
        get{ return subscriberId; }
        set{ subscriberId = value; }
    }

3.5 用MagicValue来处理NULL值
    int等类型不允许赋null值,而数据库中对应的字段是允许的,如何处理这种映射?
    注:c#2.0中提供允许空的数值类型
    在Gentle.Net中使用MagicValue来处理这种转化
        数值类型.null<-->null字段
        DateTime.Min <-->null字段,但很多数据库不支持datatime类型,很可能被截断。比较危险
    例程
        [TableColumn("id", NotNull=true), PrimaryKey(AutoGenerated=true)]
        protected int id;
        [TableColumn("name", NullValue="")]
        protected string name;
        [TableColumn("remark", NullValue="")]
        protected string remark;
 
    例程http://www.mertner.com/svn/repos/projects/gentle/Source/Gentle.Framework.Tests/BusinessObjects/PropertyHolder.cs
        [TableColumn( NotNull=false, NullValue=-1 )]
        public int TInt
        {
            get { return _int; }
            set { _int = value; }
        }

        [TableColumn( NotNull=false, NullValue=NullOption.MinValue )]
        public decimal TDecimal
        {
            get { return _decimal; }
            set { _decimal = value; }
        }

        // note: this field can be null
        // setting here is wrong for the purpose of testing SqlAnalyzer override
        [TableColumn( NotNull=true, NullValue=0 )]
        public double TDouble
        {
            get { return _double; }
            set { _double = value; }
        }
       
        [TableColumn( NotNull=false )]
        public DateTime TDateTime
        {
            get { return _datetime; }
            set { _datetime = value; }
        }
    对可空类型的支持尚在日程表中,但还不是很紧迫。可以到JIRA查看开发进度
    http://www.mertner.com/jira/browse/GOPF-30


3.6 创建DataView
    不再推荐使用ObjectView类。请在数据绑定时使用TypedArrayList和TypedArrayItemBase来定制对象的展示
 
3.7 同步控制
    Gentle.Net提供行级别得同步控制,来取保数据完整性
    为了使用同步控制功能,需要添加一个integer类型字段,并在代码中赋予Concurrency特性。
    当你尝试更新一个过期数据时,gentle会抛出异常Error.Recordchanged。故必须封装所有更新操作捕获该错误。
    如果你使用Persistent作为基类,通过创建自己的基类并重载更新方法来实现它?
    可以使用Refresh方法来修复同步错误(在Persistent,PersistenceBroker和Broker类中),它会重新获取新数据,再重新调用更新操作
 
3.8 缓存(Caching)和 唯一性(Uniqing)
    (1)出于提高性能考虑而采取的策略
    (2)缓存配置
            DefaultStragegy = Temporary | Never | Permanent
            CacheStatements = true | false
            CacheObjects    = false | true
            SkipQueryExecution = false | true
            UniqingScope    = Thread | Application | WebSession
         缓存配置例子
            <Cache>
                <DefaultStrategy>Temporary</DefaultStrategy>
                <CacheStatements>true</CacheStatements>
                <CacheObjects>true</CacheObjects>
                <SkipQueryExecution>false</SkipQueryExecution>
                <UniqingScope>Thread</UniqingScope>
            </Cache>
         SqlStatement对象的缓存:GentleNet自动缓存所有statement对象
         对象的缓存
         QuerySkipping
            当开启SkipQueryExecution时,Gentle将缓存查询结果信息
            若该信息在先前已被缓存,则gentle使用已缓存的对象来构建查询结果,这样就免去了数据库操作,大大改善了查询性能。严重推荐。
    (3)对象唯一性(Object Uniqing)
        使用对象唯一性,就不必操作多个内存对象来描述同一数据库行。
        这不仅是一种节省内存的机制,也有助于防止数据不一致
    (4)对象缓存和唯一性带来的线程安全问题
        然而,既然使用了对象缓存和唯一性,某个线程就可以使用另外一个线程使用的对象引用,这就引进了线程安全性问题
        为了解决这种问题,gentle提供了UniqingScope设置,用于将缓存和唯一性特性限制到应用程序范畴(Application Scope)或线程范畴(Thread Scope)
            ·应用程序范畴:在统一AppDomain中的对象使用相同的缓存
            ·线程范畴:每个线程使用自己的缓存
        线程范畴保证了线程安全,当如果在每个线程中都创建很多对象的话,缓存机制就没有什么意义了
        故,通常对于ASP.NET应用程序使用线程范畴,而其它使用应用程序范畴。
    (5)监控缓存使用情况(Monitoring)
        GentleStatistics.LogStatistics( LogCategory.Cache )
    (6)提示和窍门
        使用Gentle.Common.CachedManager类
            例如,可以使用它将对象永久保存在内存。
            该类非常有用,例如缓存custom IGentleProvider或PersistenceBroker对象,Gentle自动确保它们不会被垃圾收集所释放
            在ASP.NET应用程序中,需要维护一个键用于保存缓存中的项目,例如创建一个guid并将它保存在session中或保存在页面的ViewState变量中。
            当然,必须小心使用永久缓存对象功能,要是你不告诉CacheManager,它们将永久保存在缓存中

3.9 验证Validation
    Gentle验证框架提供了程序验证公用层(common layer)
    提供的验证器
        RegexValidator         [RegexValidator(Express=@"[A-Z]+[a-..."]
        RequiredValidator      [RequiredValidator()]
        RangeValidator         [RangeValidator(Min=20.5, Max=100.5)]
    自定义验证器
        需要扩展ValidatorBaseAttribute或实现在Validate方法中被调用的IValidationPersistent接口
        该方法在更新和新建时被调用

4 OR 映射技术
    遗传映射(Inheritance Mapping)
        Gentle使用“一个类,一张表”的方法来实现对象层次映射
            这种方法最早被实现并很好的实现了,是最主要的方法
            这意味着任何类都对应一种表
            当对象无关联并不共享字段时,这种方法干得不错
            是一种“平”对象继承(flat object hierachy)
            可参考这篇非常棒的文章:http://www.agiledata.org/essays/mappingObjects.html#MapEachClassToTable
        也可以使用多个类映射到单张表
            用一个字段来存储记录类型,该字段必须标注TableColumn和Inheritance特性
            如果你有许多有共享字段且相关联的类,这种方法是比较有用的。
            When you select the classes, gentle will filter out rows that are not the specified type itself or a descendant of it.
            可以查看测试项目中的MultiType.cs 和 TestMultiType.cs 文件,看看他们是如何工作的:
            [TableName( "MultiType" )]
            public abstract class MultiType : Persistent
            {
                [TableColumn, PrimaryKey( AutoGenerated=true ), SequenceName( "MULTITYPE_SEQ" )] protected int id = 0;
                [TableColumn, Inheritance] protected string type;
                [TableColumn] protected int field1 = 1;
                [TableColumn] protected decimal field2 = 2;
                [TableColumn] protected double field3 = 3;
                [TableColumn] protected string field4 = "4";
       
                public MultiType()
                {
                }
       
                public static object Retrieve( Type t, int id )
                {
                    Key key = new Key( t, true, "id", id );
                    return Broker.RetrieveInstance( t, key );
                }
       
                public static MultiType Retrieve( int id )
                {
                    Key key = new Key( typeof(MultiType), true, "id", id );
                    return Broker.RetrieveInstance( typeof(MultiType), key ) as MultiType;
                }
       
                public int Id
                {
                    get { return id; }
                }
                public string Type
                {
                    get { return type; }
                }
            }
       
            [TableName( "MultiType" )]
            public class Animal : MultiType
            {
                new public static Animal Retrieve( int id )
                {
                    return Retrieve( typeof(Animal), id ) as Animal;
                }
            }
       
            [TableName( "MultiType" )]
            public class Dog : Animal
            {
                new public static Dog Retrieve( int id )
                {
                    return Retrieve( typeof(Dog), id ) as Dog;
                }
            }
       
            [TableName( "MultiType" )]
            public class Cat : Animal
            {
                new public static Cat Retrieve( int id )
                {
                    return Retrieve( typeof(Cat), id ) as Cat;
                }
            }           
        Aggeregated Object
            将单个类映射到一个或多个父类的字段
            例子:Money类具有Currency和Amount属性
            不太明白p34
        动态表映射
            在类中通过实现ITableName接口来重载表名(在TableName特性中设置)
            若你的类中实现了该接口,Gentle会检测到,以访问不同的表
性能考虑
    数据库分析
        gentle使用特性attributes(曾用xml来支持)来映射metadata和数据库
    对象创建
        gentle可以使用几乎所有有效的构造器来创建对象,并且,对于列数组,gentle将自动的采用最低成本的构造方式。
        创建成本是以下方面的总和:p36
    缓存(Caching)
    性能比较

                           
------------------------------------------------------------
使用MyGeneration-Gentle.NET 业务实体模板
------------------------------------------------------------

分享到:
评论

相关推荐

    Beginning C# 2008 Databases From Novice to Professional

    Beginning C# 2008 Databases teaches all the fundamentals of database technology and database programming readers need to quickly become highly proficient database users and application developers. ...

    [附源码+数据库+毕业论文+部署教程+配套软件]基于SpringBoot+MyBatis+MySQL+Maven+Vue的停车场管理系统,推荐!

    一、项目简介 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷 二、技术实现 jdk版本:1.8 及以上 ide工具:IDEA或者eclipse 数据库: mysql5.5及以上 后端:spring+springboot+mybatis+maven+mysql 前端: vue , css,js , elementui 三、系统功能 1、系统角色主要包括:管理员、用户 2、系统功能 前台功能包括: 用户登录 车位展示 系统推荐车位 立即预约 公告展示 个人中心 车位预定 违规 余额充值 后台功能: 首页,个人中心,修改密码,个人信息 用户管理 管理员管理 车辆管理 车位管理 车位预定管理,统计报表 公告管理 违规管理 公告类型管理 车位类型管理 车辆类型管理 违规类型管理 轮播图管理 详见 https://flypeppa.blog.csdn.net/article/details/146122666

    springboot656基于java-springboot的农机电招平台毕业设计(代码+数据库+论文+PPT+演示录像+运行教学+软件下载).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql 部署环境:maven 数据库工具:navica 更多毕业设计https://cv2022.blog.csdn.net/article/details/124463185

    Python程序设计学习思维导图-仅供参考

    内容为Python程序设计的思维导图,适用于新手小白进行浏览,理清思路

    2024-Stable Diffusion全套资料(软件+关键词+模型).rar

    2024-Stable Diffusion全套资料(软件+关键词+模型).rar

    mmexport1741417035005.png

    mmexport1741417035005.png

    COMSOL三维锂离子电池全耦合电化学热应力模型:模拟充放电过程中的多物理场耦合效应及电芯内应力应变情况,COMSOL锂离子电池热应力全耦合模型,comsol三维锂离子电池电化学热应力全耦合模型锂离子

    COMSOL三维锂离子电池全耦合电化学热应力模型:模拟充放电过程中的多物理场耦合效应及电芯内应力应变情况,COMSOL锂离子电池热应力全耦合模型,comsol三维锂离子电池电化学热应力全耦合模型锂离子电池耦合COMSOL固体力学模块和固体传热模块,模型仿真模拟电池在充放电过程中由于锂插层,热膨胀以及外部约束所导致的电极的应力应变情况结果有电芯中集流体,电极,隔膜的应力应变以及压力情况等,电化学-力单向耦合和双向耦合 ,关键词: 1. COMSOL三维锂离子电池模型; 2. 电化学热应力全耦合模型; 3. 锂离子电池; 4. 固体力学模块; 5. 固体传热模块; 6. 应力应变情况; 7. 电芯中集流体; 8. 电极; 9. 隔膜; 10. 电化学-力单向/双向耦合。,COMSOL锂离子电池全耦合热应力仿真模型

    基于传递矩阵法的一维层状声子晶体振动传输特性及其优化设计与应用,声子晶体传递矩阵法解析及应用,Matlab 一维层状声子晶体振动传输特性 传递矩阵法在声子晶体的设计和应用中具有重要作用 通过调整声子

    基于传递矩阵法的一维层状声子晶体振动传输特性及其优化设计与应用,声子晶体传递矩阵法解析及应用,Matlab 一维层状声子晶体振动传输特性 传递矩阵法在声子晶体的设计和应用中具有重要作用。 通过调整声子晶体的材料、周期和晶格常数等参数,可以设计出具有特定带隙结构的声子晶体,用于滤波、减震、降噪等应用。 例如,通过调整声子晶体的周期数和晶格常数,可以改变带隙的位置和宽度,从而实现特定的频率范围内的噪声控制。 此外,传递矩阵法还可以用于分析和优化声子晶体的透射谱,为声学器件的设计提供理论依据。 ,Matlab; 一维层状声子晶体; 振动传输特性; 传递矩阵法; 材料调整; 周期和晶格常数; 带隙结构; 滤波; 减震; 降噪; 透射谱分析; 声学器件设计,Matlab模拟声子晶体振动传输特性及优化设计研究

    头部姿态估计(HeadPose Estimation)-Android源码

    头部姿态估计(HeadPose Estimation)-Android源码

    永磁同步电机FOC、MPC与高频注入Simulink模型及基于MBD的代码生成工具,适用于Ti f28335与dspace/ccs平台开发,含电机控制开发文档,永磁同步电机控制技术:FOC、MPC与高

    永磁同步电机FOC、MPC与高频注入Simulink模型及基于MBD的代码生成工具,适用于Ti f28335与dspace/ccs平台开发,含电机控制开发文档,永磁同步电机控制技术:FOC、MPC与高频注入Simulink模型开发及应用指南,提供永磁同步电机FOC,MPC,高频注入simulink模型。 提供基于模型开发(MBD)代码生成模型,可结合Ti f28335进行电机模型快速开发,可适用dspace平台或者ccs平台。 提供电机控制开发编码器,转子位置定向,pid调试相关文档。 ,永磁同步电机; FOC控制; MPC控制; 高频注入; Simulink模型; 模型开发(MBD); Ti f28335; 电机模型开发; dspace平台; ccs平台; 编码器; 转子位置定向; pid调试。,永磁同步电机MPC-FOC控制与代码生成模型

    light of warehouse.zip

    light of warehouse.zip

    考虑温度和气体排放等因素的工业乙醇发酵过程及其Matlab源码-乙醇发酵-气体排放-Matlab建模和仿真-代谢路径

    内容概要:文章深入讨论了工业乙醇发酵的基本原理及工艺流程,特别是在温度和气体排放(如CO2及其他有害气体)影响下的发酵效果分析。文章介绍了乙醇发酵的重要环节,如糖分解、代谢路径、代谢调控以及各阶段的操作流程,重点展示了如何通过Matlab建模和仿真实验来探索这两个关键环境因素对发酵过程的具体影响。通过动态模型仿真分析,得出合适的温度范围以及适时排除CO2能显著提升发酵产乙醇的效果与效率,从而提出了基于仿真的优化发酵生产工艺的新方法。 适用人群:从事生物工程相关领域研究的科学家、工程师及相关专业师生。 使用场景及目标:适用于实验室环境、学术交流会议及实际生产指导中,以提升研究人员对该领域内复杂现象的理解能力和技术水平为目标。 其他说明:附录中有详细的数学公式表达和程序代码可供下载执行,便于有兴趣的研究团队重复实验或者继续扩展研究工作。

    Tomcat资源包《Tomcat启动报错:CATALINA-HOME环境变量未正确配置的完整解决方案》

    本资源包专为解决 Tomcat 启动时提示「CATALINA_HOME 环境变量未正确配置」问题而整理,包含以下内容: 1. **Apache Tomcat 9.0.69 官方安装包**:已验证兼容性,解压即用。 2. **环境变量配置指南**: - Windows 系统下 `CATALINA_HOME` 和 `JAVA_HOME` 的详细配置步骤。 - 常见错误排查方法(如路径含空格、未生效问题)。 3. **辅助工具脚本**:一键检测环境变量是否生效的批处理文件。 4. **解决方案文档**:图文并茂的 PDF 文档,涵盖从报错分析到成功启动的全流程。 适用场景: - Tomcat 9.x 版本环境配置 - Java Web 开发环境搭建 - 运维部署调试 注意事项: - 资源包路径需为纯英文,避免特殊字符。 - 建议使用 JDK 8 或更高版本。

    java毕业设计源码 仿360buy京东商城源码 京东JavaWeb项目源代码

    这是一款仿照京东商城的Java Web项目源码,完美复现了360buy的用户界面和购物流程,非常适合Java初学者和开发者进行学习与实践。通过这份源码,你将深入了解电商平台的架构设计和实现方法。欢迎大家下载体验,提升自己的编程能力!

    java-springboot+vue的乒乓球馆预约管理系统源码.zip

    系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。

    【javaweb毕业设计源码】大学生求职就业网

    这是一款专为大学生打造的求职就业网JavaWeb毕业设计源码,功能齐全,界面友好。它提供简历投递、职位搜索、在线交流等多种实用功能,能够帮助你顺利进入职场。无论你是想提升技术水平还是寻找灵感,这个源码都是不可多得的资源。快来下载,让你的求职之路更加顺畅吧!

    useTable(1).ts

    useTable(1).ts

    DSP实验报告汇总.pdf

    实验一: 1、进行CCS6.1软件的安装,仿真器的设置,程序的编译和调试; 2、熟悉CCS软件中的C语言编程; 3、使用按键控制LED跑马灯的开始与停止、闪烁频率; 4、调试Convolution、FFT、FIR、FFT-FIR实验,编制IIR算法并调试,并在CCS软件上给出实验结果。 实验二: 1、利用定时器周期中断或下溢中断和比较器比较值的修改来实现占空比可调的PWM波形; 2、改变PWM占空比控制LED灯的亮暗,按键实现10级LED灯亮暗调整; 3、模拟数字转换,转换过程中LED指示,并在变量窗口显示转换结果; 4、数字模拟转换,产生一个正弦波,转换过程中LED指示,转换完成后在CCS调试窗口显示波形。 实验三: 1、SCI异步串行通信实验; 2、SPI及IIC同步串行通信实验; 3、CAN现场总线串行通信实验; 4、传输过程中LED指示。 实验四: 1、电机转速控制实验。

    LINUX系统管理与配置.docx

    LINUX系统管理与配置.docx

    chromedriver-mac-x64-136.0.7055.0.zip

    chromedriver-mac-x64-136.0.7055.0.zip

Global site tag (gtag.js) - Google Analytics