C#操作LINQ to SQL組件停止數據庫建模的根本教程。本站提示廣大學習愛好者:(C#操作LINQ to SQL組件停止數據庫建模的根本教程)文章只能為提供參考,不一定能成為您想要的結果。以下是C#操作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_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);
}
}
}
法式運轉成果以下:

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();
}
}
}
法式的運轉以下:

用於數據庫銜接的DataContext對象成員
DataContext類位於System.Data.Linq.dll法式集中的System.Data.Linq稱號空間下。在LINQ to SQL中擔任實體對象和數據庫之間的數據交流及其他數據庫操作,還擔任把數據庫中的數據映照成實體類的實例。
DataContext是LINQ to SQL操作實體類樹立後緊接著須要操作的對象。本文總結其經常使用函數和屬性的感化及經常使用用法,實體類是上一節的GuestInfo.cs類,數據庫也采取上一節的數據庫Database1.mdb,上面的示例法式對對象和屬性按其功效停止了需要的分組,代碼中也有詳實的正文。代碼以下:
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>
/// 用於數據庫銜接的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自界說數據庫和實體類\Database1.mdf;Integrated Security=True;User Instance=True";
//1.結構函數
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自界說數據庫和實體類\Database1.mdf";
//3.DatabaseExists、DeleteDatabase、CreateDatabase
if (dc.DatabaseExists())
{
Console.WriteLine("數據庫文件曾經存在.");
dc.DeleteDatabase();
}
dc.CreateDatabase();
if (dc.DatabaseExists())
{
Console.WriteLine("{0} 數據庫文件創立勝利.",Path.GetFileName(fileName ));
}
Console.WriteLine("-----------------");
Console.ReadKey();
//4_1.ExecuteCommand 作為LINQ彌補直接用SQL指令操作數據庫
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彌補直接用SQL指令操作數據庫
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轉換為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轉換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 運用修正
var firstrow = (from p in dc.GetTable<GuestInfoEntity>()
select p).First();
firstrow.Name =firstrow.Name +"A";
dc.SubmitChanges();//運用修正
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刷新實體對象
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操作數據庫時發生的並發抵觸合集
//Transaction屬性 設置或前往DataContext跟其他ADO.NET法式同享的事物對象
//ObjectTrackingEnabled屬性 開啟或封閉DataContext實體對象的狀況跟蹤
//8.Log屬性 前往DataContext發生的SQL敕令
dc.Log = Console.Out;//掌握台輸入DataContext發生的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();
}
}
}
法式中的正文很具體,不再贅述。
法式的運轉成果以下:

操作單一表格的Table<TEntity>類
後面引見了DataContext類,它可以用來映照和銜接數據庫,履行SQL敕令,跟蹤實體對象的狀況。
上面引見Table<TEntity>表現表格記載,它是一個泛型聚集類,它的元素就是表格實體對象。它供給一組辦法,對元素停止添加刪除操作,並可以經由過程DataContext將這些操作保留到數據庫。
表照樣後面的那張表,在項目中添加了一個LINQ to SQL類。重點是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附加實體
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僅僅附加實體,數據庫沒有更新
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("---------");
//顯示數據庫沒有更新
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();
}
}
}
法式運轉成果以下:
