作者:赤脚思考时间:8/30/2010 5:04:58 PM
关于数据库访问技术,通常使用的研究数据库可能更多的是Northwind。呵呵!至少,我经常折腾这样的示例数据库。尽管如此,对这个数据库的理解,自我感觉还是挺肤浅的。或者,我只是觉得没必要把这个数据库吃得这么透彻。^_^我想恐怕正是因为这样肤浅的理解,才产生了这样的代码!
这个代码本身的目的是研究LINQ to SQL的多对多映射关系。因为我对Northwind数据库了解不多,所以不知道它的哪些数据表有这样的多对多关系。所以,试着自己准备这样的测试数据库。否则,我将如何验证自己的猜测?呵呵,这种必要的准备还是需要做的,虽然时间少了。假如,如果能得心应手,直接切入测试论证的主题,那自然就更好了。
先说数据库的定义吧!其实也很简单。我想要的数据模型是这样的:有一个数据表来存储客户信息(Customers),存储产品信息的数据表(Products),以及保存客户选择购买的产品的数据表(CustomersProducts)。有了这三个数据表,我基本上可以测试它们。它们之间的关系也很清楚,一个客户可以订购任何多个产品,一个产品也可以由任何多个客户订购。因此,客户和产品之间存在多对多的关系,这种关系的建立是通过CustomersProducts连接表完成的。呵呵,就是这么简单!看截图吧!
下图是保存客户信息的数据表(Customers)的定义:
下图是保存产品信息的数据表(Products)的定义:
下图是用来连接客户表和产品表的连接表(CustomersProducts)的定义:
是不是很简单?也很愚蠢?呵呵,你就点吧!这只是用来测试的数据表。不要要要求太严格!^_^
数据表的定义已经存在,然后是准备数据。哈哈,我以为我不太傻,至少不会傻到手动添加这样的数据。如果是这样,那么你真的应该为自己的愚蠢付出痛苦的代价。最后,我忍不住喊道:“妈妈!”啊,这个世界。
数据从何而来?首先想到的是Northwind数据库。事实上,它已经有了存储客户的数据表(Customers)以及存储产品的数据表(Products)。读取这些数据,然后将其放入测试数据表中。如果你看看我之前做的数据库的定义,你会发现我只是把Northwind中的定义搬了过来。^_能偷懒就偷懒!为什么要无缘无故地杀死自己的脑细胞?
这样,就有任务将一个数据库中的数据复制到另一个数据库中。虽然有很多方法可以实现,但当然,我知道的很少。此外,我最近特别喜欢LINQ,即使是LINQ to SQL,这也是一个让我非常感兴趣的话题。因此,计划使用LINQ to SQL完成了这样一项复制数据的任务。
简而言之,这就是从数据库中读取数据,然后将数据保存到另一个数据库中。但是,如果我们想使用LINQ to SQL要实现这一点,你不能只有一个对象模型,因为它涉及两个数据库,所以至少需要两个对象模型,只有两个对象模型就足够了。一个是Northwind数据库的对象模型,另一个是测试数据库的对象模型。前一个对象模型的主要用途是读取数据,而后一个对象模型的主要任务是添加数据。
首先,我必须声明,在这种情况下,我不会手动建立这样的两个对象模型。这样做是不明智的!在这个时候,自然不会放过VS对象关系设计器提供的便利。一口气创建了两个DBML文件,然后使用对象关系设计器进行操作。最后觉得还是不理想,直接彻底的做了DBML文件的内科手术。经过这次手术,DBML文件突然明白了我的编码规则,感觉好多了。我还是一口气放出三张截图看看吧!
下图显示了解决方案资源管理器中项目文件的截图:
其中,Northwindnd.databaseeend文件是用来建立Northwind数据库的对象模型.dbml文件用于建立测试数据库的对象模型。让我们看看它们在对象关系设计器中看起来是什么样子!下图显示了northwind.对象关系设计器中dbml的位置:
啊!两个人站得这么近,就是没有手牵手,真可惜!-_-
下图显示了Database.对象关系设计中dbml的造型:
然而,这张照片在光天化日之下表达了赤裸裸的真实三角关系!^_^哈哈,就连VS的对象关系设计师也很清楚这一点!好吧,胡说八道。最后,发布代码。看看剩下的!
static void Main(string[] args){ NorthwindDataContext ndc = new NorthwindDataContext(); DatabaseDataContext ddc = new DatabaseDataContext(); // ********************************************************************** // 将Cutomers数据表的所有客户从Northwind数据库中读取,并保存在测试数据库中。 // ********************************************************************** 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();}