日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

关于ORM中只有XML没有映射实体的思考?期待大家的建议

發(fā)布時(shí)間:2024/4/14 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于ORM中只有XML没有映射实体的思考?期待大家的建议 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

開篇

?????? 很久沒(méi)有寫文章了,之前開了太多的系列,一方面是由于自己對(duì)于工作中的思考,另一方面是自己在業(yè)務(wù)時(shí)間中的對(duì)知識(shí)的總結(jié),這里也是比較抱歉,因?yàn)橹伴_的系列,一直都是

開,完整寫完的不多,這里實(shí)在是對(duì)不住大家了,我也是想等過(guò)年期間好好的整理下,這些系列和思路,將要寫的內(nèi)容,都梳理清楚,然后在年后,將一一發(fā)布,完善如下的幾個(gè)系列:

?????? 1、Step by Step-構(gòu)建自己的ORM系列-索引

?????? 2、設(shè)計(jì)模式-系列索引

?????? 3、系統(tǒng)架構(gòu)師-基礎(chǔ)到企業(yè)應(yīng)用架構(gòu)-系列索引

?????? 4、云計(jì)算-從基礎(chǔ)到應(yīng)用架構(gòu)系列索引

???????? 當(dāng)然,我期間可能會(huì)還有其他的相關(guān)文章會(huì)開啟,但是我不會(huì)影響這些文章的進(jìn)步,不然就太對(duì)不起大伙了,也希望大家多多提出自己的想法和意見,有了你們的幫助,我才能寫的

更完善。謝謝!

摘要

???????? 最近在項(xiàng)目中也是遇到如下的問(wèn)題,也是查看了一些相應(yīng)的資料,但是都沒(méi)有很好的解決,問(wèn)題如下:

???????? 1、如何只通過(guò)XML文件來(lái)完成映射,當(dāng)然這里的XML負(fù)責(zé)ORM中的數(shù)據(jù)庫(kù)表列的相應(yīng)信息。

???????? 2、不想為數(shù)據(jù)庫(kù)中的每個(gè)表都建立實(shí)體對(duì)象。

???????? 3、能夠仍然在界面使用的過(guò)程中方便的操作。

???????? 4、還要考慮一些適應(yīng)性和低耦合性方面的要求。

???????? 有了上面的幾個(gè)要求,經(jīng)過(guò)思考,得出一下的幾個(gè)思路,但是都不是理想的解決方案,還請(qǐng)大家看后以下的幾個(gè)解決方案,給出意見。

解決思路

??????????????????? 上面也是給出了幾個(gè)問(wèn)題,我對(duì)這幾個(gè)問(wèn)題進(jìn)行了整理和思考,得出下面的幾個(gè)解決方案,但是都不是特別的理想,稍微的深入提出需求,就無(wú)法滿足。

?????? 一、通過(guò)NHibernate

??????????? 當(dāng)然,Nhibernate本身已經(jīng)提供了這方面的操作,我特別的舉例說(shuō)明如下,如果想詳細(xì)的查看,請(qǐng)參考園子里面的高手博客《李永京》的。

??????????? 我這里將代碼貼出:

??????????? 1、我們先看映射文件

<class entity-name="Contract"><id name="Id" type="int"><generator class="Test"/></id><property name="Name" not-null="true" length="25" type="string"/><property name="Pay" not-null="true" type="decimal"/> <property name="CreateTime" not-null="true" type="datetime"/> <property name="Description" not-null="true" length="200" type="string"/></class>

??????????? 2、其他的配置,我就不詳細(xì)說(shuō)了,關(guān)于Nhibernate的配置。下面給出相應(yīng)的示例代碼:

??? using (ISession session = new SessionFactory().OpenSession())
??? {
??????? using (ITransaction trans = session.BeginTransaction())
??????? {
??????????? IDictionary contract = new Hashtable();
??????????? contract["Name"] = "合同名稱";
??????????? contract["Pay"] = 0.0M;//合同的金額
??????????? contract["Description"] = "合同的描述信息";

??????????? //第一個(gè)參數(shù)為映射中使用的實(shí)體名稱,第二個(gè)參數(shù)為實(shí)例
??????????? session.Save("Contract", contract);
??????????? trans.Commit();
??????? }
??? }

??????????? 上面給出的保存的代碼,更新的代碼雷同。給出查詢代碼:

??? using (ISession session = new SessionFactory().OpenSession())
??? {
??????? using (ITransaction trans = session.BeginTransaction())
??????? {
??????????? IDictionary contract =(IDictionary) session.CreateQuery(“ from Contract where ContractID=:id”)

?????????????????????????????????????????????????? .Add(“id”,1);

?????????????????????????????????????????????????? .UniqueResult();

??????????? session.Clear();

??????????? trans.Commit();
??????? }
??? }

??????????? 通過(guò)上面的代碼,經(jīng)過(guò)測(cè)試,的確能夠?qū)?shù)據(jù),通過(guò)Nhibernate提供的相應(yīng)方法,完成訪問(wèn)。其他的相應(yīng)的操作,我就不給出了,但是通過(guò)上面我們知道,我們沒(méi)有通過(guò)創(chuàng)建相應(yīng)的實(shí)體,我

們就能完成映射的操作,的確不錯(cuò),不過(guò),這樣的實(shí)現(xiàn),的確有些不便。

?

????????????? 二、通過(guò)自定義對(duì)象

????????????? 這個(gè)自定義對(duì)象應(yīng)該如何來(lái)做呢?自定義對(duì)象的思路如下:

?????????????

???????????? 下面來(lái)配合這個(gè)圖給出示例代碼,不一定可以運(yùn)行,具體的公共對(duì)象類代碼如下:

public class CommonObject : IList
??? {
??????? private IDictionary<string, Column> columns = null;
??????? public CommonObject()
??????? {
??????????? columns = new Dictionary<string, Column>();
??????? }

??????? public CommonObject(int capacity)
??????? {
??????????? columns = new Dictionary<string, Column>(capacity);
??????? }

??????? public Column Add(Column col)
??????? {
??????????? this.columns.Add(col.Name,col);

??????????? return col;
??????? }

??????? public bool Remove(Column col)
??????? {
??????????? return this.columns.Remove(col.Name);
??????? }

??????? public Column this[string key]
??????? {
??????????? get
??????????? {
??????????????? return this.columns[key];
??????????? }
??????????? set
??????????? {
??????????????? this.columns[key] = value;
??????????? }
??????? }


??????? public int Add(object value)
??????? {
??????????? throw new NotImplementedException();
??????? }

??????? public void Clear()
??????? {
??????????? throw new NotImplementedException();
??????? }

??????? public bool Contains(object value)
??????? {
??????????? throw new NotImplementedException();
??????? }

??????? public int IndexOf(object value)
??????? {
??????????? throw new NotImplementedException();
??????? }

??????? public void Insert(int index, object value)
??????? {
??????????? throw new NotImplementedException();
??????? }

??????? public bool IsFixedSize
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }

??????? public bool IsReadOnly
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }

??????? public void Remove(object value)
??????? {
??????????? throw new NotImplementedException();
??????? }

??????? public void RemoveAt(int index)
??????? {
??????????? throw new NotImplementedException();
??????? }

??????? public object this[int index]
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????????? set
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }

??????? public void CopyTo(Array array, int index)
??????? {
??????????? throw new NotImplementedException();
??????? }

??????? public int Count
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }

??????? public bool IsSynchronized
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }

??????? public object SyncRoot
??????? {
??????????? get
??????????? {
??????????????? throw new NotImplementedException();
??????????? }
??????? }

??????? public IEnumerator GetEnumerator()
??????? {
??????????? throw new NotImplementedException();
??????? }
??? }

?????????? 具體的代碼上面已經(jīng)給出,下面給出Column的示例代碼:

class Column
??? {
??????? public string Name
??????? {
??????????? get;
??????????? set;
??????? }

??????? public object Value
??????? {
??????????? get;
??????????? set;
??????? }

??????? public System.Data.DbType DataType
??????? {
??????????? get;
??????????? set;
??????? }

??????? public string? DbColumnName
??????? {
??????????? get;
??????????? set;
??????? }

??????? public int Length
??????? {
??????????? get;
??????????? set;
??????? }

??????? public bool IsNull
??????? {
??????????? get;
??????????? set;
??????? }
??? }

??? 當(dāng)然上面給出的不是完整的,只是為了演示說(shuō)明。這樣就能完成與XML之間的映射,具體的訪問(wèn)的過(guò)程中也可以相對(duì)來(lái)說(shuō)更友好一些。

????? public void Test()
?????? {
?????????? CommonObject comObj = CommonFactory<CommonObject>();

?????????? comObj.Add(new Column());


?????????? comObj["test"] = new Column();
?????? }

?????? private T CommonFactory<T>()
?????? {
?????????? return (T)Activator.CreateInstance(typeof(T));
?????? }

?????? 三、通過(guò).NET 4.0中的動(dòng)態(tài)類型來(lái)完成

???????????????? 下面給出實(shí)現(xiàn)的思路吧:

????????????????? 我們通過(guò)利用.NET4.0中的dynimic來(lái)定義一個(gè)內(nèi)存中的實(shí)例,該實(shí)例是通過(guò)XML文件 中的配置的列屬性來(lái)動(dòng)態(tài)的創(chuàng)建,具體的代碼如下:

static void Main(string[] args)
??????? {
??????????? dynamic obj=? GetTest();
??????????? Console.WriteLine(obj.name);
??????????? Console.WriteLine(obj.tt);
??????????? System.Threading.Thread.Sleep(10000);
??????? }

??????? private static dynamic GetTest()
??????? {
??????????? dynamic obj = new ExpandoObject();

??????????? var person = obj as IDictionary<string, object>;

??????????? person["name"] = "test";
??????????? person["tt"] = "aaa";

??????????? return obj;
??????? }

??????? 通過(guò)上面的這個(gè)思路,我們就可以如下來(lái)做:

?????? private static dynamic GetTest1(string xmlFile)
??????? {
??????????? dynamic obj = new ExpandoObject();

??????????? var person = obj as IDictionary<string, object>;

??????????? XmlDocument doc = new XmlDocument();
??????????? doc.LoadXml(xmlFile);

??????????? Property [] list = XMLHelper.GetPropertys(doc);
??????????? foreach (Property property in list)
??????????? {
??????????????? person[property.Name] = property.Value;
??????????? }

??????????? person["name"] = "test";
??????????? person["tt"] = "aaa";

??????????? return obj;
??????? }

??????? 這樣就完成了,動(dòng)態(tài)創(chuàng)建對(duì)象的過(guò)程,并且在應(yīng)用可以之間使用動(dòng)態(tài)創(chuàng)建的對(duì)象,但是有如下問(wèn)題

???????

??????? 通過(guò)上圖中的描述,我想大家都知道,動(dòng)態(tài)類型是動(dòng)態(tài)運(yùn)行時(shí)的編譯,不是靜態(tài)編譯,必須在運(yùn)行時(shí)才能解析出動(dòng)態(tài)對(duì)象的屬性信息,因此我們使用起來(lái)并不方便,所以我想到如下辦法。

?

???????

??????? 我思考完,發(fā)現(xiàn)如果要是可以實(shí)現(xiàn)這樣的插件也就好了,當(dāng)然目前的思路就到這,查看了相關(guān)職能感知的相關(guān)文件,但是沒(méi)有發(fā)現(xiàn)API可以直接設(shè)置或者可以之間進(jìn)行控制的方法。

其他可行思路

????????? 當(dāng)然我上面只是給了幾種可能可行的方案,但是不一定是合適的方案,還請(qǐng)大家多多指教和拍磚,如果您有好的思路或者實(shí)現(xiàn)方案,還請(qǐng)您提出來(lái),多謝您的指

教。

后續(xù)

???????? 下篇如果我有好的實(shí)現(xiàn)思路,我會(huì)給出完整的實(shí)現(xiàn),當(dāng)然如果沒(méi)有思路,那就暫時(shí)寫到這里,多謝大家的集思廣益,可能我鉆牛角尖了,也說(shuō)不定。

轉(zhuǎn)載于:https://www.cnblogs.com/hegezhou_hot/archive/2011/01/21/1941450.html

總結(jié)

以上是生活随笔為你收集整理的关于ORM中只有XML没有映射实体的思考?期待大家的建议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。