六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

nhibernate源碼區(qū)分之一: 對(duì)象映射

[摘要]1. 持久對(duì)象映射文件關(guān)于持久對(duì)象映射文件,這里就不多說了,可參考nhibernate的例子和文檔。在nhibernate源代碼的根目錄里有一個(gè)nhibernate-mapping-2.0.xsd文檔,這個(gè)文檔是nhibernate用來對(duì)映射文件進(jìn)行驗(yàn)證的,我們也可以借助相關(guān)軟件用這個(gè)文檔來驗(yàn)證映...
1. 持久對(duì)象映射文件

關(guān)于持久對(duì)象映射文件,這里就不多說了,可參考nhibernate的例子和文檔。
在nhibernate源代碼的根目錄里有一個(gè)nhibernate-mapping-2.0.xsd文檔,這個(gè)文檔是nhibernate用來對(duì)映射文件進(jìn)行驗(yàn)證的,我們也可以借助相關(guān)軟件用這個(gè)文檔來驗(yàn)證映射文件的有效性。

2. 映射信息的讀取

通過Configuration類,可以用多種方式讀取映射信息,一些以Add開頭的方法就是用來加入映射信息的,這些方法最終將調(diào)用Add(XmlDocument doc)。

//** Configuration.cs **

private Hashtable classes = new Hashtable();
classes集合用于存放所有的持久對(duì)象映射信息,
它的Key為持久類的類型;Value為PermissionClass類的子類。

private void Add(XmlDocument doc) {
try {
Binder.dialect = Dialect.Dialect.GetDialect(properties);
Binder.BindRoot( doc, CreateMappings());
}
catch (MappingException me) {
log.Error("Could not compile the mapping document", me);
throw me;
} // end try/catch
}

AddDocument方法調(diào)用Binder的靜態(tài)方法BindRoot來綁定持久類映射信息。CreateMappings返回一個(gè)Mappings對(duì)象,此對(duì)象是一個(gè)簡單封裝了所有映射信息集合的類。

3. 建立對(duì)象映射信息

Binder類的BindRoot用于綁定映射信息中的所有映射內(nèi)容。

//** Binder.cs **

public static void BindRoot(XmlDocument doc, Mappings model) {
// ...

foreach(XmlNode n in hmNode.SelectNodes(nsPrefix + ":class", nsmgr) ) {
RootClass rootclass = new RootClass();
Binder.BindRootClass(n, rootclass, model);
model.AddClass(rootclass);
}

// ...
}

遍歷所有的類映射節(jié)點(diǎn),然后調(diào)用BindRootClass來綁定類映射信息,最后將類映射信息加到集合中。
其中RootClass為PermissionClass的子類。

public static void BindRootClass(XmlNode node, RootClass model, Mappings mappings) {
BindClass(node, model, mappings);

//TABLENAME
XmlAttribute tableNameNode = node.Attributes["table"];
string tableName = (tableNameNode==null)
? StringHelper.Unqualify( model.PersistentClazz.Name )
: tableNameNode.Value;

XmlAttribute schemaNode = node.Attributes["schema"];
string schema = schemaNode==null ? mappings.SchemaName : schemaNode.Value;
Table table = mappings.AddTable(schema, tableName);
model.Table = table;

// ...

PropertiesFromXML(node, model, mappings);
}

BindRootClass首先調(diào)用BindClass綁定持久類映射信息,然后調(diào)用PropertiesFromXML來綁定類屬性。

public static void BindClass(XmlNode node, PersistentClass model, Mappings mapping) {
string className = node.Attributes["name"] == null ? null : node.Attributes["name"].Value;

// class
try {
model.PersistentClazz = ReflectHelper.ClassForName(className);
}
catch ( Exception cnfe ) {
throw new MappingException( "persistent class not found", cnfe);
}

// ...
}

BindClass通過反射來取得持久對(duì)象的類型。

protected static void PropertiesFromXML(XmlNode node, PersistentClass model, Mappings mappings) {
string path = model.Name;
Table table = model.Table;

foreach(XmlNode subnode in node.ChildNodes) {
CollectionType collectType = CollectionType.CollectionTypeFromString(name);
Value value = null;
if (collectType!=null) {
value = new Value(table);
BindValue(subnode, value, true);
}
else if ( "many-to-one".Equals(name) ) {
value = new ManyToOne(table);
BindManyToOne(subnode, (ManyToOne) value, propertyName, true);
}
else if ( "any".Equals(name) ) {
value = new Any(table);
BindAny(subnode, (Any) value, true);
}
else if ( "one-to-one".Equals(name) ) {
value = new OneToOne(table, model.Identifier );
BindOneToOne(subnode, (OneToOne) value, true);
}
else if ( "property".Equals(name) ) {
value = new Value(table);
BindValue(subnode, value, true, propertyName);
}
else if ( "component".Equals(name) ) {
value = new Component(model);
BindComponent(subnode, (Component) value, reflectedClass, subpath, true, mappings);
}
else if ( "subclass".Equals(name) ) {
Subclass subclass = new Subclass(model);
BindSubclass( subnode, subclass, mappings );
}
else if ( "joined-subclass".Equals(name) ) {
Subclass subclass = new Subclass(model);
BindJoinedSubclass( subnode, subclass, mappings);
}
if ( value!=null) {
Property prop = new Property(value);
BindProperty(subnode, prop, mappings);
}
}
}

遍歷所有子節(jié)點(diǎn),然后根據(jù)節(jié)點(diǎn)類型對(duì)進(jìn)行綁定。(注: 部分內(nèi)容已刪除)
關(guān)于屬性的映射以后有空再詳細(xì)研究,只需要知道屬性已加入到RootClass的Properties屬性就行了。




主站蜘蛛池模板: 一级毛片一级毛片一级毛片一级毛片 | 真实国产乱子伦精品一区二区三区 | 人人爽天天爽夜夜爽曰 | 天天躁夜夜躁狠狠躁 | 天天做天天欢天天爽 | 亚洲porn| 午夜手机视频 | 天天干天天天天 | 天天操中文字幕 | 欧美香蕉在线 | 午夜网站入口 | 天天干天天草天天射 | 欧美特黄一区二区三区 | 最近2019中文字幕大全视频一页 | 亚洲欧美成人完整版在线 | 亚洲欧美综合色区小说 | 武则天a级片 | 日本高清在线视频www色下载 | 亚洲是色 | 在线看国产人成www免费看下载 | 无人区国产大片 | 亚州中文字幕 | 四虎影视永久免费观看网址 | 四虎最新网址 | 伊人狠狠 | 天天操天天摸天天曰天天干天天弄天天干 | 日本高清在线观看视频 | 色网站免费 | 三级小说在线 | 日本一区二区三区免费观看 | 色噜噜噜噜噜在线观看网站 | 色偷偷91综合久久噜噜app | 伊人网站在线观看 | 日本天堂视频 | 四虎影视库国产精品一区 | 四色婷婷婷婷色婷婷开心网 | 午夜伦伦 | 日韩在线三级视频 | 亚洲第一看片 | 香蕉在线视频网站 | 日本人视频18jizz免费 |