自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Entity Framework的存儲模型切換實踐

數(shù)據(jù)庫
Entity Framework是微軟以ADO.NET為基礎(chǔ)所發(fā)展出來的對象關(guān)系對應(yīng)解決方案。它完全支持上層穩(wěn)定的概念架構(gòu)與底層具體可變動的存儲架構(gòu)之間的獨立和分離的,在本文中我們將具體實踐這一特性。

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

作者簡介

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

[[8789]]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5、通過修改連接字符串來切換不同的SSDL

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

 

  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=&quot;  
  4. Data Source=D:\Practice\SQLite\Ricky.db;&quot。 

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

補充:

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

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

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

【編輯推薦】

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

 

 

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

 

 

責任編輯:王曉東 來源: 博客園
相關(guān)推薦

2024-06-18 12:58:12

2012-07-20 10:38:25

Entity FramEF

2021-02-04 18:04:53

DbContext開源對象

2016-08-16 09:06:07

Entity FramT4模板sql語句

2019-11-21 09:00:00

數(shù)據(jù)驗證EF Core

2009-12-22 14:46:09

ADO.NET Ent

2012-09-10 10:23:38

Entity Fram

2009-11-03 16:27:43

ADO.NET Ent

2009-12-30 14:03:36

ADO.NET Ent

2019-11-13 15:40:00

Entity Fram審計數(shù)據(jù)數(shù)據(jù)庫

2009-12-30 10:14:41

ADO.NET Ent

2010-04-20 09:40:38

ADO.NET Ent

2009-09-04 14:52:03

ADO.NET Ent

2024-09-23 00:00:00

數(shù)據(jù)庫場景Entity

2009-12-31 14:56:36

ADO.NET Ent

2009-12-23 16:00:50

ADO.NET Ent

2009-12-22 17:14:37

ADO.NET Ent

2009-12-30 09:10:04

ADO.NET Ent

2011-03-30 13:14:05

Entity Fram

2009-12-23 16:15:24

ADO.NET Ent
點贊
收藏

51CTO技術(shù)棧公眾號