日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
EntityFramework的存儲(chǔ)模型切換實(shí)踐

【本文選自微軟MVP林立的博客】最近做一個(gè)項(xiàng)目,里面需要同時(shí)支持SQL Server和SQLite??紤]到Entity Framework雖然目前還有諸多不足,但是基本上滿足于我的項(xiàng)目的要求,加上,也希望做一個(gè)嘗試,畢竟,雖然使用過(guò)去的技術(shù)和手段可能更可靠、更熟練、風(fēng)險(xiǎn)更低。

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括寧陽(yáng)網(wǎng)站建設(shè)、寧陽(yáng)網(wǎng)站制作、寧陽(yáng)網(wǎng)頁(yè)制作以及寧陽(yáng)網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,寧陽(yáng)網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到寧陽(yáng)省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

作者簡(jiǎn)介

林立,微軟ASP.NET與C# MVP,專注和熱衷于將.NET平臺(tái)下較為成熟的新技術(shù)實(shí)踐于實(shí)際項(xiàng)目開(kāi)發(fā),近期著重于研究Entity Framework和Windows Workflow Foundation。

但是,在技術(shù)行業(yè),不能止步不前,如果某種新技術(shù)有你需要的某些特性,并且你認(rèn)為值得嘗試,那就應(yīng)該出手試試,雖然嘗試可能會(huì)失?。ㄒ约安坏貌煌滔率‘a(chǎn)生的苦果),但是如果成功,其帶來(lái)的好處也是很大的,也代表著你又往前邁進(jìn)了一步。對(duì)于Entity Framework我也是新手,如果各位朋友發(fā)現(xiàn)文中有什么可以改進(jìn)的地方或者不正確的地方,歡迎指點(diǎn)。

廢話不多說(shuō)了,切入正題。Entity Framework需要三種文件支持:CSDL(概念架構(gòu)定義語(yǔ)言)、SSDL(存儲(chǔ)架構(gòu)定義語(yǔ)言)、MSL(映射規(guī)范語(yǔ)言),以及,一個(gè)據(jù)此生成的類文件(這里我們不研究這個(gè)類文件)。從這種結(jié)構(gòu)上看,EF是完全支持上層穩(wěn)定的概念架構(gòu)與底層具體可變動(dòng)的存儲(chǔ)架構(gòu)之間的獨(dú)立和分離的。但通常我們利用VS的設(shè)計(jì)器只能生成一個(gè)單獨(dú)的.edmx文件,其中包含了CSDL、SSDL和MSL的內(nèi)容,而本質(zhì)上,它們3個(gè)是完全可以獨(dú)立成3個(gè)文件的。對(duì)于我們當(dāng)前的目標(biāo),我們需要把SSDL從.edmx文件中剝離出來(lái),并創(chuàng)立分別針對(duì)于SQL Server和SQLite的SSDL,下面詳述一下我的做法。

1、根據(jù)SQL Server中的表、視圖結(jié)構(gòu),創(chuàng)建SQLite數(shù)據(jù)庫(kù)

由于之前已經(jīng)SQL Server上已經(jīng)有了相關(guān)的表和視圖,因此以Sql Server為模板,創(chuàng)建SQLite數(shù)據(jù)庫(kù),并在SQLite數(shù)據(jù)庫(kù)中創(chuàng)建與SQL Server中的表和視圖幾乎完全一樣的表和視圖。之所以說(shuō)“幾乎完全一樣”,是因?yàn)镾QLite中的類型系統(tǒng)與SQL Server中的差別很大。但是因?yàn)槲覜](méi)有用到SQL Server中太特別的類型,因此這個(gè)問(wèn)題的解決相對(duì)容易一些。我從SQL Server中生成表和視圖的腳本,然后修改一下讓SQLite可以識(shí)別和執(zhí)行。

主要的修改包括,去掉“dbo”架構(gòu)的指定,將自增標(biāo)識(shí)列主鍵的聲明“int identity(1,1) primary key”改為“integer primary key autoincrement”,后者是SQLite中自增列主鍵的聲明語(yǔ)句,對(duì)于其他簡(jiǎn)單類型,比如varchar/nvarchar, bit, money等等類型則保留原有的聲明不變,這些類型雖然SQLite并不“支持”,但是執(zhí)行的時(shí)候并不會(huì)出錯(cuò),而且利用“.schema”命令查詢表架構(gòu)時(shí),這些類型的聲明是被保留的(后面在生成針對(duì)SQLite的EDM的時(shí)候,似乎也說(shuō)明這些類型聲明產(chǎn)生了正面作用),另外,有一點(diǎn),這次我沒(méi)有用到DateTime類型,因此無(wú)法斷定2種數(shù)據(jù)庫(kù)對(duì)它的支持的差別。SQLite的類型系統(tǒng)的特點(diǎn)是,動(dòng)態(tài)性,雖然你創(chuàng)建表的時(shí)候可以指定某種“類型”,但是你完全可以向一個(gè)“int”列插入一個(gè)字符串。最后,我沒(méi)有在SQLite中創(chuàng)建任何外鍵約束,雖然SQLite支持外鍵,但是為了簡(jiǎn)化復(fù)雜性(畢竟這是我的初次嘗試),就犧牲一些“完整性”吧。由于保證了SQLite中的表和視圖與Sql Server中的完全一致(除了類型上的固有差別),因此,可以保證兩者在創(chuàng)建EDM的時(shí)候,其CSDL和MSL是完全相同的。

2、依據(jù)SQL Server創(chuàng)建EDM

具體方法就和我們平常做的一樣。利用VS比較強(qiáng)大的設(shè)計(jì)器,從SQL Server中生成模型,并且創(chuàng)建好各個(gè)實(shí)體之間的Association。經(jīng)過(guò)這一步,我們會(huì)得到一個(gè).EDMX文件以及一個(gè)對(duì)應(yīng)的類文件。

3、創(chuàng)建針對(duì)SQL Server的SSDL文件

用XML編輯器打開(kāi)上面生成的.EDMX文件,可以很清楚的分辨出SSDL、CSDL、MSL三部分。我們把“”節(jié)點(diǎn)下的節(jié)點(diǎn)的所有內(nèi)容Copy出來(lái),然后新建一個(gè)后綴名為.SSDL的XML文件,把Copy出來(lái)的Schema元素粘貼進(jìn)去,保存,就可以了。

4、創(chuàng)建針對(duì)SQLite的SSDL文件

這一步有2種辦法:將針對(duì)SQL Server的SSDL文件復(fù)制一份過(guò)來(lái),然后將其修改成符合SQLite的要求。主要是去掉一些SQLite不支持的東西,比如,對(duì)于Schema="dbo"這樣的聲明。以及,修改Schema元素的Provider屬性和ProviderManifestToken屬性。前者需要修改為"System.Data.SQLite",后者修改為“ISO8601”(為何改成這2個(gè)值?看到后面就會(huì)知道了)利用VS的設(shè)計(jì)器重新針對(duì)SQLite數(shù)據(jù)庫(kù)生成一份EDMX文件,然后抽取其中的SSDL定義。

我采用的是第二種方法:這里需要用到針對(duì)SQLite的ADO.NET提供程序,即System.Data.SQLite。這個(gè)東西真正的下載地址在http://sourceforge.net/projects/sqlite-dotnet2/files/。

下載完成之后,可以安裝,然后就可以在項(xiàng)目中引用System.Data.SQLite并利用設(shè)計(jì)器創(chuàng)建針對(duì)SQLite數(shù)據(jù)庫(kù)的EDM。創(chuàng)建和提取SSDL的內(nèi)容與針對(duì)SQL Server的完全一樣,不再贅述,由此,我們可以得到一個(gè)針對(duì)SQLite的SSDL文件,其中Schema元素的Provider屬性值是System.Data.SQLite,而ProviderManifestToken屬性是ISO8601。

這里還需要指出的一點(diǎn)是,后來(lái)在測(cè)試的時(shí)候,發(fā)現(xiàn)運(yùn)行失敗,原因是,在SSDL中存在不同的表/實(shí)體類型中引用和被引用的字段(外鍵字段)Type屬性不一致的情況,比如假設(shè)Company類型的CompanyID字段在Company類型中的type是integer,但是在引用它的Employee類型中的CompanyID字段的type是int,在這里,比如把它們2個(gè)統(tǒng)一為int或integer才可以。

5、通過(guò)修改連接字符串來(lái)切換不同的SSDL

在我的項(xiàng)目中,我將這2個(gè)SSDL分別作為2個(gè)不同的程序集的資源內(nèi)嵌到程序集中。然后通過(guò)修改連接字符串來(lái)切換到某個(gè)SSDL。連接字符串看起來(lái)是這樣的:

 
 
 
  1. metadata=res://GE/GTDP.GTDEDM.csdl|res://LiteTDP/LiteTDP.GTDEDM.ssdl|res://GE/GTDP.GTDEDM.msl;  
  2. provider=System.Data.SQLite;  
  3. provider connection string="  
  4. Data Source=D:\Practice\SQLite\Ricky.db;"。 

注意連接字符串中對(duì)于CSDL、SSDL、MSL的指定,都指定到具體程序集的相關(guān)資源,其中黃色底色部分指定了使用SQLite的SSDL,而CSDL和MSL則直接使用了第二步中生成的EDMX中的內(nèi)容。

補(bǔ)充:

在第二步中生成的EDMX被完整的保留下來(lái),這樣,仍然可以隨時(shí)利用設(shè)計(jì)器打開(kāi)和操作。而針對(duì)SQLite生成的EDMX在提取需要的SSDL之后被我刪掉了。當(dāng)然了,是留是刪,完全看需要,很久沒(méi)有寫(xiě)東西,都不會(huì)說(shuō)話了,如果讀起來(lái)別扭,請(qǐng)多包涵了。

本文轉(zhuǎn)載自零度的火的博客,

原文地址:http://www.cnblogs.com/Ricky81317/archive/2010/02/22/1670867.html

【編輯推薦】

  1. 關(guān)系數(shù)據(jù)庫(kù)的根本問(wèn)題分析及數(shù)據(jù)庫(kù)革命之走向
  2. 探尋關(guān)系數(shù)據(jù)庫(kù)和ORM的最佳替代者
  3. 數(shù)據(jù)庫(kù)機(jī)時(shí)代將到來(lái) DBA面臨新挑戰(zhàn)
  4. 分布式緩存系統(tǒng)Memcached入門(mén)指導(dǎo)
  5. 扔掉沉沒(méi)成本 嘗試關(guān)系數(shù)據(jù)庫(kù)替代品OODBMS

【責(zé)任編輯:王曉東 TEL:(010)68476606】


網(wǎng)站題目:EntityFramework的存儲(chǔ)模型切換實(shí)踐
本文來(lái)源:http://www.dlmjj.cn/article/cdhciep.html