作者:光腳丫思考
時間:8/30/2010 5:04:58 PM
有關於資料庫訪問技術,通常所用到的研習資料庫或許更多的要算是Northwind了。呵呵!至少,我自己是經常折騰這樣的一個樣本資料庫。雖然如此,對這個資料庫的瞭解,自我感覺還是相當的膚淺的。或者,只是自己認為沒有必要把這個資料庫吃的那麼透徹。^_^我想恐怕正是因為有了這樣膚淺的認識,最後就產生了這樣的一個代碼吧!
這個代碼本身的用意乃是在於研習LINQ to SQL的多對多映射關係。因為自己對Northwind資料庫不太瞭解,也就不知道它的哪些資料表具有這樣一種多對多的關係。於是乎,就自己試圖去準備一個這樣的測試資料庫。不然,我將如何去驗證我自己的推測呢?呵呵,這種必要的準備還是需要做的,雖然花費了少少了一些時間。如果,要是能夠信手拈來,直接切入測試論證的主題,那自然是更爽了。
首先來說說資料庫的定義吧!其實也很簡單。我想要的資料模型是這樣的:有一個儲存客戶資訊的資料表(Customers),一個儲存產品資訊的資料表(Products),和一個儲存客戶選中的選中購買的產品的資料表(CustomersProducts)。有了這樣的3個資料表,基本上已經夠我測試使用了。而它們之間的關係也是很明確的,一個客戶可以訂購任意多個產品,而一個產品也可以被任意多個客戶訂購。因此,客戶和產品之間存在著多對多的關係,而這一關係的建立則是通過CustomersProducts這個聯結表來完成的了。呵呵,就是如此的簡單!扣個上來看看吧!
是儲存客戶資訊的資料表(Customers)的定義:
是儲存產品資訊的資料表(Products)的定義:
則是用來串連客戶表和產品表的聯結表(CustomersProducts)的定義:
是不是很簡單?也很愚蠢呀?呵呵,你就將就點吧!這隻是用來測試的資料表,別要求的太嚴格了!^_^
資料表的定義已經有了,接著就是準備資料了。呵呵,我自以為我不算太傻,起碼不至於傻到一條一條的去手動添加這樣的資料吧。如果真是這樣,那就真該為自己傻而付出慘痛的代價。最後終於忍不住得叫聲“娘了!”哎,這世道。
資料從何而來呢?第一想到的就是Northwind資料庫了。其實它的裡面已經有了儲存客戶的資料表(Customers)和儲存產品的資料表(Products)。只需要把這些資料讀取出來,然後放到測試資料表中,就可以了。如果,你自己看我前面所做的資料庫的定義,應該就會發現,其實我只是把Northwind中的定義給搬了過來而已。^_^能偷懶就偷懶嘛!何必無緣無故殺死自己的腦細胞呢?
這樣就存在將一個資料庫中的資料複製到另一個資料庫中去的任務了。雖然可以實現的方式還是比較多的,當然,我所瞭解的還是很少的。加上,自己最近對LINQ是那樣的情有獨鐘,即使是LINQ to SQL,也是讓我大感興趣的課題。於是,就打算使用LINQ to SQL來完成這樣的一個複製資料的任務。
簡單的說,這也就是一個從資料庫中讀取資料,然後再將資料儲存到另一個資料庫中去。但如果我們想要使用LINQ to SQL來實現這點話,你就不能只有一個物件模型,因為所涉及到的是兩個資料庫,所以,至少得需要兩個物件模型,也只需要兩個物件模型就足夠了。一個是Northwind資料庫的物件模型,另一個則是測試資料庫的物件模型。前一個物件模型的主要用途是讀取資料,而後一個物件模型的主要任務則是添加資料。
首先,我得申明一下,在這種情況下,我是不會去手動建立這樣的兩個物件模型的。那樣做是不明智的!此時,自然是不會放過VS的物件關聯式設計工具所提供的方便了。一口氣就建立了兩個DBML檔案,然後使用物件關聯式設計工具進行一番的操作。最後覺得還是不太理想,又乾脆地直接地徹底地對DBML檔案作了一個內科手術。經過這番手術之後,DBML檔案一下子就明白了我的編碼規則,這種感覺爽多了。我還是一口氣放出3個來看看吧!
是方案總管中的專案檔:
其中Northwind.dbml檔案是用來建立Northwind資料庫的物件模型,而Database.dbml檔案則是用來建立測試資料庫的物件模型。也分別看看他們在物件關聯式設計工具中分別都長啥樣子吧!
是Northwind.dbml在物件關聯式設計工具中的姿勢:
哎!兩人站的這麼近,就是沒有手牽手,真是遺憾呀!-_-
是Database.dbml在對象關係設計中的造型:
而這幅圖卻在光天化日之下,表達著赤裸裸的真正的三角關係!^_^呵呵,連VS的物件關聯式設計工具都深諳此道呀!
好了廢話就說這麼多了。
最後把代碼放出來吧,剩下的就自己看吧!
static void Main(string[] args) { NorthwindDataContext ndc = new NorthwindDataContext(); DatabaseDataContext ddc = new DatabaseDataContext(); // ********************************************************************** // 從Northwind資料庫中將Cutomers資料表的所有客戶都讀取出來,並儲存到測試資料庫中。 // ********************************************************************** var AllCustomersInNorthwind = from CustomerObject in ndc.Customers select CustomerObject; foreach (var CustomerObject in AllCustomersInNorthwind) { Customer NewCustomer = new Customer() { CustomerID = CustomerObject.CustomerID, ContactName = CustomerObject.ContactName, ContactTitle = CustomerObject.ContactTitle, Country = CustomerObject.Country, City = CustomerObject.City, Address = CustomerObject.Address, Region = CustomerObject.Region }; ddc.Customers.InsertOnSubmit(NewCustomer); } ddc.SubmitChanges(); // ********************************************************************** // 從Northwind資料庫中將Products資料表的所有客戶都讀取出來,並儲存到測試資料庫中。 // ********************************************************************** var AllProductsInNorthwind = from ProductObject in ndc.Products select ProductObject; foreach (var ProductObject in AllProductsInNorthwind) { Product NewProduct = new Product() { ProductName = ProductObject.ProductName, UnitPrice = ProductObject.UnitPrice, UnitsInStock = ProductObject.UnitsInStock, UnitsOnOrder = ProductObject.UnitsOnOrder }; ddc.Products.InsertOnSubmit(NewProduct); } ddc.SubmitChanges(); // ********************************************************************** // 根據測試資料庫中的資料自動產生客戶的產品訂購資訊。 // ********************************************************************** var AllCustomers = from CustomerObject in ddc.Customers select CustomerObject; var AllProducts = from ProductObject in ddc.Products select ProductObject; Random RandomObject = new Random(); foreach (var CustomerObject in AllCustomers) { int SkipCount = RandomObject.Next(0, AllCustomers.Count() - 1); int TakeCount = RandomObject.Next(1, AllCustomers.Count() - SkipCount); var RandomProducts = AllProducts.Skip(SkipCount).Take(TakeCount); foreach (var ProductObject in RandomProducts) { CustomerProduct NewCustomerProduct = new CustomerProduct() { CustomerID = CustomerObject.CustomerID, ProductID = ProductObject.ProductID, UnitPrice = ProductObject.UnitPrice }; ddc.CustomersProducts.InsertOnSubmit(NewCustomerProduct); } } ddc.SubmitChanges(); }