C#操作LINQ to SQL組件進(jìn)行數(shù)據(jù)庫建模的基本教程
建立實(shí)體類
使用LINQ to SQL時(shí),需要首先建立用于映射數(shù)據(jù)庫對象的模型,也就是實(shí)體類。在運(yùn)行時(shí),LINQ to SQL 根據(jù)LINQ表達(dá)式或查詢運(yùn)算符生成SQL語句,發(fā)送到數(shù)據(jù)庫進(jìn)行操作。數(shù)據(jù)庫返回后,LINQ to SQL負(fù)責(zé)將結(jié)果轉(zhuǎn)換成實(shí)體類對象。
建立實(shí)體類的方法有很多,例如LINQ to SQL設(shè)計(jì)器,手動編碼建立,使用XML文件映射,使用命令行工具SqlMetal生成等。其中最方便的就是LINQ to SQL設(shè)計(jì)器。
1.使用LINQ to SQL設(shè)計(jì)器建立實(shí)體類
在一個(gè)示例用的Demo控制臺程序中添加一個(gè)“基于服務(wù)的數(shù)據(jù)庫”Database1.mdf,建立一張tb_GuestInfo的表。該表的詳細(xì)如下:
下面的所有建立方式,都用的這個(gè)數(shù)據(jù)庫。
在項(xiàng)目中添加一個(gè)LINQ to SQL類,采用默認(rèn)的名稱DataClasses1.dbml,如下:
將tb_GuestInfo表拖到界面上,保存。
OK,編寫相關(guān)代碼如下,實(shí)現(xiàn)增刪改查:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQ_To_SQL自定義數(shù)據(jù)庫和實(shí)體類
{
/// <summary>
/// 實(shí)體類的建立___1.VS建立實(shí)體類
/// </summary>
class Program
{
static void Main(string[] args)
{
//
DataClasses1DataContext dc = new DataClasses1DataContext();
//1.查詢
IQueryable<tb_GuestInfo> query = from p in dc.tb_GuestInfo
where 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);
}
}
}
程序運(yùn)行結(jié)果如下:
2.手動建立實(shí)體類
實(shí)體類在多數(shù)情況下可以通過LINQ to SQL類設(shè)計(jì)器建立,當(dāng)然動手建立一個(gè)簡單的實(shí)體類也不是難事,并且可以更好的學(xué)習(xí)LINQ to SQL的對象模型。數(shù)據(jù)庫依然是前面的示例數(shù)據(jù)庫。
在項(xiàng)目中添加一個(gè)類GuestInfoEntity.cs,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq.Mapping;
namespace DataContexDemo
{
/// <summary>
/// 手動建立實(shí)體類
/// </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;//關(guān)注
namespace DataContexDemo
{
class Program
{
static void Main(string[] args)
{
//2.手動建立實(shí)體類
//
//連接字符串
string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數(shù)據(jù)庫和實(shí)體類\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();
}
}
}
程序運(yùn)行如下:
3.使用XML映射文件建立實(shí)體類
實(shí)體類的映射除了使用內(nèi)聯(lián)Attribute外,還可以建立一個(gè)包含映射信息的XML文件,此文件生成System.Data.Linq.Mapping.XmlMappingSource對象,作為DataContext對象構(gòu)造方法的參數(shù)。
這個(gè)XML文件只有一個(gè)根節(jié)點(diǎn)---Database元素,用來映射的數(shù)據(jù)庫信息。Database元素包含一個(gè)或多個(gè)Table元素,用于映射數(shù)據(jù)庫表的信息,Table元素由一個(gè)Type元素和多個(gè)Column元素(或Association元素)組成。Type元素用來指定實(shí)體類,Column元素用來指定列信息,Association元素用來映射數(shù)據(jù)庫關(guān)系。
在項(xiàng)目中添加一個(gè)XML文件,采用默認(rèn)名稱XMLFile1.xml,內(nèi)容如下:
<?xml version="1.0" encoding="utf-8" ?> <Database Name="Database1" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007"><!--數(shù)據(jù)庫名稱可隨意;名稱空間一定要加上--> <Table Name="tb_GuestInfo"><!--數(shù)據(jù)庫中表的名稱--> <Type Name="LINQtoSQL建立實(shí)體類_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>
這個(gè)XML文件包含類全部的映射信息,下面建立映射的類GuestInfoEntity.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQtoSQL建立實(shí)體類_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建立實(shí)體類_XML
{
class Program
{
static void Main(string[] args)
{
string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數(shù)據(jù)庫和實(shí)體類\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();
}
}
}
程序的運(yùn)行如下:
用于數(shù)據(jù)庫連接的DataContext對象成員
DataContext類位于System.Data.Linq.dll程序集中的System.Data.Linq名稱空間下。在LINQ to SQL中負(fù)責(zé)實(shí)體對象和數(shù)據(jù)庫之間的數(shù)據(jù)交換及其他數(shù)據(jù)庫操作,還負(fù)責(zé)把數(shù)據(jù)庫中的數(shù)據(jù)映射成實(shí)體類的實(shí)例。
DataContext是LINQ to SQL操作實(shí)體類建立后緊接著需要操作的對象。本文總結(jié)其常用函數(shù)和屬性的作用及常用用法,實(shí)體類是上一節(jié)的GuestInfo.cs類,數(shù)據(jù)庫也采用上一節(jié)的數(shù)據(jù)庫Database1.mdb,下面的示例程序?qū)ο蠛蛯傩园雌涔δ苓M(jìn)行了必要的分組,代碼中也有詳盡的注釋。代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using System.IO;
using System.Data.SqlClient;
namespace DataContext對象成員
{
/// <summary>
/// 用于數(shù)據(jù)庫連接的DataContext類成員
/// </summary>
class Program
{
static void Main(string[] args)
{
//連接字符串
string constring = @"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數(shù)據(jù)庫和實(shí)體類\Database1.mdf;Integrated Security=True;User Instance=True";
//1.構(gòu)造函數(shù)
DataContext dc = new DataContext(constring);
//2.GetTable
Table<GuestInfoEntity> table = dc.GetTable<GuestInfoEntity>();
var query = table.AsEnumerable();
foreach(var g in query)
{
Console.WriteLine("{0} {1} {2} {3}",g.ID,g.Name,g.Age,g.Tel );
}
Console.WriteLine("-----------------");
Console.ReadKey();
string fileName = @"E:\Visual Studio 2010\LINQ_to_SQL\LINQ_To_SQL自定義數(shù)據(jù)庫和實(shí)體類\Database1.mdf";
//3.DatabaseExists、DeleteDatabase、CreateDatabase
if (dc.DatabaseExists())
{
Console.WriteLine("數(shù)據(jù)庫文件已經(jīng)存在.");
dc.DeleteDatabase();
}
dc.CreateDatabase();
if (dc.DatabaseExists())
{
Console.WriteLine("{0} 數(shù)據(jù)庫文件創(chuàng)建成功.",Path.GetFileName(fileName ));
}
Console.WriteLine("-----------------");
Console.ReadKey();
//4_1.ExecuteCommand 作為LINQ補(bǔ)充直接用SQL指令操作數(shù)據(jù)庫
dc.ExecuteCommand("insert into tb_GuestInfo(Name,Age,Tel) values({0},{1},{2})","DebugLZQ",25,"198****1336");
foreach (var r in dc.GetTable<GuestInfoEntity>())
{
Console.WriteLine("{0} {1} {2} {3}",r.ID,r.Name,r.Age,r.Tel );
}
Console.WriteLine("-----------------");
Console.ReadKey();
//4_2.ExecuteQuery 作為LINQ補(bǔ)充直接用SQL指令操作數(shù)據(jù)庫
var rows= dc.ExecuteQuery<GuestInfoEntity>("select * from tb_GuestInfo");
foreach (var r in rows)
{
Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
}
Console.WriteLine("-----------------");
Console.ReadKey();
//4_3Translate 將DbReader轉(zhuǎn)換為LINQ對象
string queryString = "select * from tb_GuestInfo";
SqlConnection connection = new SqlConnection(constring);
SqlCommand cmd = new SqlCommand(queryString, connection);
connection.Open();
var result = dc.Translate<GuestInfoEntity>(cmd.ExecuteReader());//ADO.NET轉(zhuǎn)換LINQ
foreach (var r in result)
{
Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
}
connection.Close();
Console.WriteLine("-----------------");
Console.ReadKey();
//5.SubmitChanges 應(yīng)用修改
var firstrow = (from p in dc.GetTable<GuestInfoEntity>()
select p).First();
firstrow.Name =firstrow.Name +"A";
dc.SubmitChanges();//應(yīng)用修改
foreach (var r in dc.GetTable<GuestInfoEntity>() )
{
Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
}
Console.WriteLine("-----------------");
Console.ReadKey();
//6.GetChangeSet方法 返回DataContext對象插入、刪除、修改過的對象
ChangeSet cs = dc.GetChangeSet();
foreach (var r in cs.Updates )
{
GuestInfoEntity t = r as GuestInfoEntity;
Console.WriteLine("{0} {1} {2} {3}", t.ID,t.Name,t.Age,t.Tel );
}
Console.WriteLine("-----------------");
Console.ReadKey();
//7.Refresh刷新實(shí)體對象
var row1=(from g in dc.GetTable<GuestInfoEntity>() select g).First();
row1.Age = row1.Age + 5;
dc.SubmitChanges();
dc.Refresh(RefreshMode.OverwriteCurrentValues, row1);//
foreach (var r in dc.GetTable<GuestInfoEntity>())
{
Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
}
Console.WriteLine("7-----------------");
Console.ReadKey();
//ChangeConflicts屬性 返回DataContext操作數(shù)據(jù)庫時(shí)產(chǎn)生的并發(fā)沖突合集
//Transaction屬性 設(shè)置或返回DataContext跟其他ADO.NET程序共享的事物對象
//ObjectTrackingEnabled屬性 開啟或關(guān)閉DataContext實(shí)體對象的狀態(tài)跟蹤
//8.Log屬性 返回DataContext產(chǎn)生的SQL命令
dc.Log = Console.Out;//控制臺輸出DataContext產(chǎn)生的SQL語句
foreach (var r in dc.GetTable<GuestInfoEntity>())
{
Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
}
Console.WriteLine("-----------------");
Console.ReadKey();
}
}
}
程序中的注釋很詳細(xì),不再贅述。
程序的運(yùn)行結(jié)果如下:
操作單一表格的Table<TEntity>類
前面介紹了DataContext類,它可以用來映射和連接數(shù)據(jù)庫,執(zhí)行SQL命令,跟蹤實(shí)體對象的狀態(tài)。
下面介紹Table<TEntity>表示表格記錄,它是一個(gè)泛型集合類,它的元素就是表格實(shí)體對象。它提供一組方法,對元素進(jìn)行添加刪除操作,并可以通過DataContext將這些操作保存到數(shù)據(jù)庫。
表還是前面的那張表,在項(xiàng)目中添加了一個(gè)LINQ to SQL類。重點(diǎn)是InsertOnSubmit、DeleteOnSubmit等方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQ_to_SQL_Table
{
/// <summary>
/// 操作單一表格的Table<TEntity>類
/// </summary>
class Program
{
static void Main(string[] args)
{
//1.a.Attach附加實(shí)體
DataClasses1DataContext dc1 = new DataClasses1DataContext();
tb_GuestInfo guset = new tb_GuestInfo() { Id=1, Name = "DebugLZQ", Age = 35, Tel = "138****8888" };
dc1.tb_GuestInfo.Attach(guset);//這樣的Attach僅僅附加實(shí)體,數(shù)據(jù)庫沒有更新
dc1.SubmitChanges();
//顯示附加成功
foreach (var g in dc1.tb_GuestInfo)
{
Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
}
Console.WriteLine("---------");
//顯示數(shù)據(jù)庫沒有更新
DataClasses1DataContext dc2 = new DataClasses1DataContext();
foreach (var g in dc2.tb_GuestInfo)
{
Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
}
Console.WriteLine("------------------------");
Console.ReadKey();
//2.InsertOnSubmit
dc2.tb_GuestInfo.InsertOnSubmit(guset);
dc2.SubmitChanges();
foreach (var g in dc2.tb_GuestInfo)
{
Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
}
Console.WriteLine("------------------------");
Console.ReadKey();
//2b.InsertAllOnSubmit 插入集合
List<tb_GuestInfo> lst = new List<tb_GuestInfo>()
{
new tb_GuestInfo(){ Name="AA", Age=25,Tel="133****3333"},
new tb_GuestInfo(){ Name="BB", Age=25,Tel="135****5555"}
};
dc2.tb_GuestInfo.InsertAllOnSubmit(lst);
dc2.SubmitChanges();
foreach (var g in dc2.tb_GuestInfo)
{
Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
}
Console.WriteLine("------------------------");
Console.ReadKey();
//
//3.DeleteOnSubmit
tb_GuestInfo entity = (from g in dc2.tb_GuestInfo
where g.Name == "AA"
select g).Single();
dc2.tb_GuestInfo.DeleteOnSubmit(entity);//
dc2.SubmitChanges();
foreach (var g in dc2.tb_GuestInfo)
{
Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
}
Console.WriteLine("------------------------");
Console.ReadKey();
//3b.DeleteAllOnSubmit
IEnumerable<tb_GuestInfo> entitys = from g in dc2.tb_GuestInfo
where g.Name == "AA" || g.Name == "BB"
select g;
dc2.tb_GuestInfo.DeleteAllOnSubmit(entitys);
dc2.SubmitChanges();
foreach (var g in dc2.tb_GuestInfo)
{
Console.WriteLine("{0} {1} {2} {3}", g.Id, g.Name, g.Age, g.Tel);
}
Console.WriteLine("------------------------");
Console.ReadKey();
}
}
}
程序運(yùn)行結(jié)果如下:
上一篇:簡單掌握Windows中C#啟動外部程序進(jìn)程的方法
欄 目:C#教程
下一篇:C#隱式/顯示實(shí)現(xiàn)接口方法詳解
本文標(biāo)題:C#操作LINQ to SQL組件進(jìn)行數(shù)據(jù)庫建模的基本教程
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6636.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)判斷當(dāng)前操作用戶管理角色的方法
- 01-10C#中DataGridView常用操作實(shí)例小結(jié)
- 01-10C#操作ftp類完整實(shí)例
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#路徑,文件,目錄及IO常見操作匯總
- 01-10C#將圖片存放到SQL SERVER數(shù)據(jù)庫中的方法
- 01-10C#中實(shí)現(xiàn)一次執(zhí)行多條帶GO的sql語句實(shí)例
- 01-10C#操作IIS方法集合
- 01-10C#操作數(shù)據(jù)庫中存取圖片文件的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery


