LINQ to SQL 建立實體類
使用LINQ to SQL時,需要首先建立用於對映資料庫物件的模型,也就是實體類。在執行時,LINQ to SQL 根據LINQ表示式或查詢運算子生成SQL語句,傳送到資料庫進行操作。資料庫返回後,LINQ to SQL負責將結果轉換成實體類物件。
建立實體類的方法有很多,例如LINQ to SQL設計器,手動編碼建立,使用XML檔案對映,使用命令列工具SqlMetal生成等。其中最方便的就是LINQ to SQL設計器。
1.使用LINQ to SQL設計器建立實體類
在一個示例用的Demo控制檯程式中新增一個“基於服務的資料庫”Database1.mdf,建立一張tb_GuestInfo的表。該表的詳細如下:
下面的所有建立方式,都用的這個資料庫。
在專案中新增一個LINQ to SQL類,採用預設的名稱DataClasses1.dbml,如下:
將tb_GuestInfo表拖到介面上,儲存。
OK,編寫相關程式碼如下,實現增刪改查:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LINQ_To_SQL自定義資料庫和實體類 { /// <summary> /// 實體類的建立___1.VS建立實體類 /// </summary>class Program { static void Main(string[] args) { // DataClasses1DataContext dc = new DataClasses1DataContext(); //1.查詢 IQueryable<tb_GuestInfo> query = from p in dc.tb_GuestInfowhere p.Name != "XXX" select p; foreach (var g in query) { Console.WriteLine("{0} {1} {2} {3}",g.Id,g.Name,g.Age ,g.Tel ); } Console.WriteLine("-----------------"); Console.ReadKey(false); //2.增加一條記錄 tb_GuestInfo gInfo = new tb_GuestInfo() { Id = 9, Name = "M&M", Age = 40, Tel = "135****5555" }; dc.tb_GuestInfo.InsertOnSubmit(gInfo); dc.SubmitChanges(); foreach (var g in query) { Console.WriteLine("{0} {1} {2} {3}",g.Id , g.Name, g.Age, g.Tel); } Console.WriteLine("-----------------"); Console.ReadKey(false); //3.刪除 var query_itemToDelete = from g in dc.tb_GuestInfo where g.Name == "M&M" select g; foreach (var g in query_itemToDelete) { dc.tb_GuestInfo.DeleteOnSubmit(g); } dc.SubmitChanges(); foreach (var g in query) { Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel); } Console.WriteLine("-----------------"); Console.ReadKey(false); //4.修改 var query_itemToUpdate = from g in dc.tb_GuestInfo where g.Name.Contains("DebugLZQ") select g; foreach (var g in query_itemToUpdate) { g.Name = g.Name + "A"; } dc.SubmitChanges(); foreach (var g in query) { Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel); } Console.WriteLine("-----------------"); Console.ReadKey(false); } } }
程式執行結果如下:
2.手動建立實體類
實體類在多數情況下可以通過LINQ to SQL類設計器建立,當然動手建立一個簡單的實體類也不是難事,並且可以更好的學習LINQ to SQL的物件模型。資料庫依然是前面的示例資料庫。
在專案中新增一個類GuestInfoEntity.cs,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Linq.Mapping; namespace DataContexDemo { /// <summary> /// 手動建立實體類 /// </summary> [Table(Name="tb_GuestInfo")] class GuestInfoEntity { [Column(IsPrimaryKey=true,DbType="Int NOT NULL IDENTITY",IsDbGenerated=true,Name="Id")] public int ID { get; set; } [Column(DbType = "nvarchar(20)", Name = "Name")] public string Name{get;set;} [Column(DbType = "int", Name = "Age")] public int Age { get; set; } [Column(DbType = "nvarchar(20)", Name = "Tel")] public string Tel { get; set; } } }
編寫示例程式碼,注意需要引入System.Data.Linq.dll:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Linq;//關注 namespace DataContexDemo { class Program { static void Main(string[] args) { //2.手動建立實體類 // //連線字串 string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義資料庫和實體類\Database1.mdf;Integrated Security=True;User Instance=True"; DataContext dc = new DataContext(constring); Table<GuestInfoEntity> tb = dc.GetTable<GuestInfoEntity>(); var query = tb.AsEnumerable(); foreach (var q in query) { Console.WriteLine("{0} {1} {2} {3}",q.ID,q.Name,q.Age,q.Tel ); } Console.ReadKey(); } } }
程式執行如下:
3.使用XML對映檔案建立實體類
實體類的對映除了使用內聯Attribute外,還可以建立一個包含對映資訊的XML檔案,此檔案生成System.Data.Linq.Mapping.XmlMappingSource物件,作為DataContext物件構造方法的引數。
這個XML檔案只有一個根節點---Database元素,用來對映的資料庫資訊。Database元素包含一個或多個Table元素,用於對映資料庫表的資訊,Table元素由一個Type元素和多個Column元素(或Association元素)組成。Type元素用來指定實體類,Column元素用來指定列資訊,Association元素用來對映資料庫關係。
在專案中新增一個XML檔案,採用預設名稱XMLFile1.xml,內容如下:
<?xml version="1.0" encoding="utf-8" ?> <Database Name="Database1" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"><!--資料庫名稱可隨意;名稱空間一定要加上--> <Table Name="tb_GuestInfo"><!--資料庫中表的名稱--> <Type Name="LINQtoSQL建立實體類_XML.GuestInfoEntity"><!--太BT了,居然要全名;GuestInfoEntity居然不行--> <Column Name="Id" Member="ID" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true"/> <Column Name="Name" Member="Name" DbType="nvarchar(20)" /> <Column Name="Age" Member="Age" DbType="int" /> <Column Name="Tel" Member="Tel" DbType="nvarchar(20)" /> </Type> </Table> </Database>
這個XML檔案包含類全部的對映資訊,下面建立對映的類GuestInfoEntity.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LINQtoSQL建立實體類_XML { public class GuestInfoEntity { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public string Tel { get; set; } } }
編寫示例程式碼,同樣需要引入System.Data.Linq.dll:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Linq; using System.Data.Linq.Mapping; using System.IO;// namespace LINQtoSQL建立實體類_XML { class Program { static void Main(string[] args) { string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義資料庫和實體類\Database1.mdf;Integrated Security=True;User Instance=True"; XmlMappingSource map = XmlMappingSource.FromXml(File.ReadAllText("XMLFile1.xml")); DataContext dc = new DataContext(constring, map); Table<GuestInfoEntity> tb = dc.GetTable<GuestInfoEntity>(); var query = tb.AsEnumerable(); foreach (var g in query) { Console.WriteLine("{0} {1} {2} {3}",g.ID,g.Name,g.Age,g.Tel ); } Console.ReadKey(); } } }
程式的執行如下: