- 浏览: 413991 次
- 性别:
- 来自: 郑州
文章分类
最新评论
-
yan789654100:
先谢谢了,去研究一下
Java网络围棋游戏源码含大厅,仿QQ游戏 -
dan0773:
火狐里面用不了
梅花雨日历控件源码,及应用实例 -
左手边:
挺好的不错
Velocity教程 -
liuxuejin:
既然是教程,连个例子都没有!顶多是个笔记而已
Velocity教程 -
sky_pearl:
泪奔……求大厅代码!!!
Java网络围棋游戏源码含大厅,仿QQ游戏
------------------------------------------------------------
用户指南 - 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 业务实体模板
------------------------------------------------------------
发表评论
-
QT中文乱码与国际化支持
2013-03-06 14:25 1151Qt内部采用的全Unicode编码,这从根本上保证了多国语界 ... -
google play 商店图片不显示解决办法
2012-08-27 11:57 4856安装Android4.04 后Google Play 商店 图 ... -
在Android手机上安装Ubuntu完整版
2012-06-14 09:55 5328原文:http://blog.csdn.net/mapd ... -
Java常用正则表达式
2010-12-11 21:03 930"^\d+$" / ... -
Eclipse启动参数大全
2010-10-18 09:00 785Eclipse启动参数大全 < ... -
如何复制表
2010-09-27 15:08 1403SQL2005 1、说明:复制表(只复制结构,源表名: ... -
解决 DB2 日志满问题
2010-06-10 11:22 3143增加增加日志文件数量。用get db cfg 查看主日志文件数 ... -
修改Windows CMD 命令行的默认编码页字符
2009-12-16 17:47 5548顯示作用中主控台字碼頁的頁碼,或變更主控台的使用中字碼頁 ... -
LVM卷组
2009-12-10 14:41 1099本文引用自:http://blog.chinaunix.net ... -
Linux操作系统RPM与TAR的基本安装和卸载
2009-10-24 17:00 984Linux软件的安装和卸载一直是困扰许多新用户的难题。在Wi ... -
WebSphere Portal v6.1 Programming -- RAD7.5 安装手册
2009-02-17 14:45 2634WebSphere Portal v6.1 Programmi ... -
DB2 系统命令与配置参数大全
2008-01-15 15:33 1594DB2 系统命令与配置参数 ... -
面向 Java 开发人员的 db4o 指南: 简介和概览
2007-08-31 17:44 1093[转]面向 Java 开发人 ... -
Websphere MQ入门教程-使用IBM Websphere MQ
2007-08-27 20:26 11265目录... 2 前言... 9 本书范围... 9 本书读 ... -
单点登录 SSO (Single sign-on) 文章
2007-08-25 10:22 1721单点登录 SSO (Single sign-on) 文章 ... -
迁移 WebSphere Portal 数据库到 DB2
2007-08-25 10:20 1609迁移 WebSphere Portal 数据库到 DB2 2. ... -
安装配置 LDAP 过程
2007-08-25 10:14 2379以下只是经过在 RF 4.1 ... -
安装LDAP 与 DB2 Server 全过程
2007-08-25 10:10 2420安装LDAP 与 DB2 Server 3.1.1. 安装 ... -
TSM安装手册
2007-08-23 10:01 3024TSM安装手册<o:p></o:p> ... -
允许Flash跨域加载数据
2007-07-22 23:07 1944Flash 文档可通过使用以 ...
相关推荐
### Gentle.NET Business Entity 模板手册 #### 1. 引言 本文档详细介绍了 Gentle.NET Business Entity 模板的功能和使用方法。该模板是 MyGeneration 工具的一个脚本,它允许您从关系数据库中创建 C# 类,并与 ...
Gentle.NET是一个开源的优秀O/R Mapping的对象持久化框架。Gentle.NET是一个关系数据库中立的(RDBMS indenpendent)对象持久化框架。它具有以下特征: ·自动构建SQL ·自动创建实体对象 ·用于创建定制查询...
Gentle.NET是一个强大的对象持久化框架,专为.NET开发者设计,旨在简化数据库操作,将对象模型与数据库结构无缝对接。作为一个开源项目,它提供了一个高效、灵活且功能丰富的解决方案,使得开发人员能够专注于业务...
MyGeneration 是一款不错的ORM和代码生成工具...使用MyGeneration 可以为Gentle.NET, Opf3, NHibernate等生成ORM架构或ORM文件,为多种数据库生成存储过程,为.Net项目生成C#、VB.NET 程序代码,PHP、HTML等页面代码。
使用MyGeneration 可以为Gentle.NET, Opf3, NHibernate等生成ORM架构或ORM文件,为多种数据库生成存储过程,为.Net项目生成C#、VB.NET 程序代码,PHP、HTML等页面代码。 MyGeneration 具有以下的特性: 1.支持多种...
### 编译辅助程序gentle97教程:深入解析与应用 #### 一、引言:GENTLE Compiler Construction System的起源与应用 GENTLE Compiler Construction System,由德国国家信息技术研究院于1989年设计,是一款用于构建...
Gentle_NET是一个可能用于网络编程的开源库或框架,主要目标是简化.NET开发者在网络通信中的工作。这个使用文档很显然提供了关于如何有效利用Gentle_NET进行开发的详细指导。下面将对Gentle_NET的主要特性、用法以及...
**Gentle Boosting** Gentle Boosting是一种集成学习方法,属于Boosting算法的范畴。Boosting是一种迭代的弱学习算法,它通过组合多个弱分类器形成一个强分类器,提升模型的预测能力。Gentle Boosting是AdaBoost...
Opencart Template Gentle v3.0 是一款专为Opencart电子商务平台设计的专业模板,旨在提升网站的视觉效果和用户体验。这款模板具有丰富的设计元素和功能,能够满足不同类型的在线商店需求,尤其适合那些希望拥有独特...
Gentle所著的一本面向数学统计学学生的书籍,该书深入浅出地探讨了经典似然、贝叶斯以及置换推断等统计学核心概念,并对基本渐近分布理论进行了简要介绍。书中还覆盖了现代统计学的许多主题,使读者能够了解当前...
users. You can use a facility similar to cookies to store information on the client computer. And you can use new elements, such as header and footer, to help structure your documents. This book is ...
This version of the book is updated for C# 7.0 and Visual Studio 2017 Get off the ground quickly, with a gentle introduction to C#, Visual Studio, and a step-by-step walkthrough and explanation of ...
A Gentle Introduction to Category Theory 1994 Fokkinga
gentle_tensorflow, Tensorflow简介 Gentlest Tensorflow目标Tensorflow ( TF ) 尝试将深入学习的功力放入世界各地开发人员的手中。 它有一个初学者&和高级教程,以及Udacity课程。 Gentlest Tensorflow尝试克
基于gentle adaboost算法的人脸检测研究
《Common Lisp: A Gentle Introduction to Symbolic Computation》由David S. Touretzky编写,旨在为读者提供一个友好且互动的学习环境,通过丰富的数据结构和简洁的语法来教授Lisp编程的基础知识。 #### 二、为何...
ROS,即机器人操作系统(Robot Operating System),是一种用于机器人应用开发的灵活框架,它提供了一系列工具和库,使得开发者可以更加方便地构建复杂且健壮的机器人行为。在本篇《ROS初级入门》中,作者Jason M....
在实现Gentle AdaBoost的过程中,通常会采用查表法(Look-Up Table, LUT)来简化计算过程,该方法基于特征对样本的作用函数,将特征的作用区间划分为多个子区间,然后根据样本特征值落入的区间来确定弱分类器的输出...