栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#操作LINQ to SQL组件进行数据库建模的基本教程

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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自定义数据库和实体类
{
  /// 
  /// 实体类的建立___1.VS建立实体类
  /// 
  class Program
  {
    static void Main(string[] args)
    {
      //
      DataClasses1DataContext dc = new DataClasses1DataContext();
      
      //1.查询
      IQueryable 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
{
  /// 
  /// 手动建立实体类
  /// 
  [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 2010LINQ_to_SQLLINQ_To_SQL自定义数据库和实体类Database1.mdf;Integrated Security=True;User Instance=True";

      DataContext dc = new DataContext(constring);

      Table tb = dc.GetTable();

      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文件包含类全部的映射信息,下面建立映射的类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 2010LINQ_to_SQLLINQ_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 tb = dc.GetTable();

      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对象成员
{
  /// 
  /// 用于数据库连接的DataContext类成员
  /// 
  class Program
  {
    static void Main(string[] args)
    {
      
      //连接字符串
      string constring = @"Data Source=.SQLEXPRESS;AttachDbFilename=E:Visual Studio 2010LINQ_to_SQLLINQ_To_SQL自定义数据库和实体类Database1.mdf;Integrated Security=True;User Instance=True";
      //1.构造函数
      DataContext dc = new DataContext(constring);
      //2.GetTable
      Table table = dc.GetTable();
      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 2010LINQ_to_SQLLINQ_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())
      {
 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("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(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()     
     select p).First();
      firstrow.Name =firstrow.Name +"A";

      dc.SubmitChanges();//应用修改

      foreach (var r in dc.GetTable() )
      {
 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() select g).First();
      row1.Age = row1.Age + 5;
      dc.SubmitChanges();
      dc.Refresh(RefreshMode.OverwriteCurrentValues, row1);//

      foreach (var r in dc.GetTable())
      {
 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())
      {
 Console.WriteLine("{0} {1} {2} {3}", r.ID, r.Name, r.Age, r.Tel);
      }
      Console.WriteLine("-----------------");
      Console.ReadKey();

    }
  }
}

程序中的注释很详细,不再赘述。

程序的运行结果如下:


操作单一表格的Table
前面介绍了DataContext类,它可以用来映射和连接数据库,执行SQL命令,跟踪实体对象的状态。

下面介绍Table表示表格记录,它是一个泛型集合类,它的元素就是表格实体对象。它提供一组方法,对元素进行添加删除操作,并可以通过DataContext将这些操作保存到数据库。

表还是前面的那张表,在项目中添加了一个LINQ to SQL类。重点是InsertOnSubmit、DeleteOnSubmit等方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_to_SQL_Table
{
  /// 
  /// 操作单一表格的Table类
  /// 
  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 lst = new List() 
      {
 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 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();      
      
    }
  }
}

程序运行结果如下:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/124398.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号