当前位置: 首页 > 图灵资讯 > 技术篇> 使用LINQ to SQL将数据从一个数据库复制到另一个数据库

使用LINQ to SQL将数据从一个数据库复制到另一个数据库

来源:图灵教育
时间:2023-07-02 17:12:45

作者:赤脚思考时间:8/30/2010 5:04:58 PM

关于数据库访问技术,通常使用的研究数据库可能更多的是Northwind。呵呵!至少,我经常折腾这样的示例数据库。尽管如此,对这个数据库的理解,自我感觉还是挺肤浅的。或者,我只是觉得没必要把这个数据库吃得这么透彻。^_^我想恐怕正是因为这样肤浅的理解,才产生了这样的代码!

这个代码本身的目的是研究LINQ to SQL的多对多映射关系。因为我对Northwind数据库了解不多,所以不知道它的哪些数据表有这样的多对多关系。所以,试着自己准备这样的测试数据库。否则,我将如何验证自己的猜测?呵呵,这种必要的准备还是需要做的,虽然时间少了。假如,如果能得心应手,直接切入测试论证的主题,那自然就更好了。

先说数据库的定义吧!其实也很简单。我想要的数据模型是这样的:有一个数据表来存储客户信息(Customers),存储产品信息的数据表(Products),以及保存客户选择购买的产品的数据表(CustomersProducts)。有了这三个数据表,我基本上可以测试它们。它们之间的关系也很清楚,一个客户可以订购任何多个产品,一个产品也可以由任何多个客户订购。因此,客户和产品之间存在多对多的关系,这种关系的建立是通过CustomersProducts连接表完成的。呵呵,就是这么简单!看截图吧!

下图是保存客户信息的数据表(Customers)的定义:

使用LINQ to SQL将数据从一个数据库复制到另一个数据库_产品

下图是保存产品信息的数据表(Products)的定义:

使用LINQ to SQL将数据从一个数据库复制到另一个数据库_数据库_02

下图是用来连接客户表和产品表的连接表(CustomersProducts)的定义:

使用LINQ to SQL将数据从一个数据库复制到另一个数据库_数据库_03

是不是很简单?也很愚蠢?呵呵,你就点吧!这只是用来测试的数据表。不要要要求太严格!^_^

数据表的定义已经存在,然后是准备数据。哈哈,我以为我不太傻,至少不会傻到手动添加这样的数据。如果是这样,那么你真的应该为自己的愚蠢付出痛苦的代价。最后,我忍不住喊道:“妈妈!”啊,这个世界。

数据从何而来?首先想到的是Northwind数据库。事实上,它已经有了存储客户的数据表(Customers)以及存储产品的数据表(Products)。读取这些数据,然后将其放入测试数据表中。如果你看看我之前做的数据库的定义,你会发现我只是把Northwind中的定义搬了过来。^_能偷懒就偷懒!为什么要无缘无故地杀死自己的脑细胞?

这样,就有任务将一个数据库中的数据复制到另一个数据库中。虽然有很多方法可以实现,但当然,我知道的很少。此外,我最近特别喜欢LINQ,即使是LINQ to SQL,这也是一个让我非常感兴趣的话题。因此,计划使用LINQ to SQL完成了这样一项复制数据的任务。

简而言之,这就是从数据库中读取数据,然后将数据保存到另一个数据库中。但是,如果我们想使用LINQ to SQL要实现这一点,你不能只有一个对象模型,因为它涉及两个数据库,所以至少需要两个对象模型,只有两个对象模型就足够了。一个是Northwind数据库的对象模型,另一个是测试数据库的对象模型。前一个对象模型的主要用途是读取数据,而后一个对象模型的主要任务是添加数据。

首先,我必须声明,在这种情况下,我不会手动建立这样的两个对象模型。这样做是不明智的!在这个时候,自然不会放过VS对象关系设计器提供的便利。一口气创建了两个DBML文件,然后使用对象关系设计器进行操作。最后觉得还是不理想,直接彻底的做了DBML文件的内科手术。经过这次手术,DBML文件突然明白了我的编码规则,感觉好多了。我还是一口气放出三张截图看看吧!

下图显示了解决方案资源管理器中项目文件的截图:

使用LINQ to SQL将数据从一个数据库复制到另一个数据库_数据库_04

其中,Northwindnd.databaseeend文件是用来建立Northwind数据库的对象模型.dbml文件用于建立测试数据库的对象模型。让我们看看它们在对象关系设计器中看起来是什么样子!下图显示了northwind.对象关系设计器中dbml的位置:

使用LINQ to SQL将数据从一个数据库复制到另一个数据库_数据库_05

啊!两个人站得这么近,就是没有手牵手,真可惜!-_-

下图显示了Database.对象关系设计中dbml的造型:

使用LINQ to SQL将数据从一个数据库复制到另一个数据库_linq_06

然而,这张照片在光天化日之下表达了赤裸裸的真实三角关系!^_^哈哈,就连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();}