• 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 2010LINQ_to_SQLLINQ_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 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<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();
            }
        }
    }
    复制代码

    程序的运行如下:

    http://www.cnblogs.com/DebugLZQ/archive/2012/11/14/2770449.html

  • 相关阅读:
    4 种高可用 RocketMQ 集群搭建方案!
    Spring @Autowired 注解自动注入流程是怎么样?
    AQS 自定义同步锁,挺难的!
    PyCharm爬虫实例:使用Scrapy抓取网页特定内容、数据采集与数据预处理--biaobiao88
    Ubuntu中安装Hadoop出现的问题
    Win10系统FF新推荐弹窗的卸载方法
    Sublime Text 中文乱码(解决)
    JProfiler的安装
    稀疏数组
    算法基础<一>
  • 原文地址:https://www.cnblogs.com/hellowzd/p/4547134.html
Copyright © 2020-2023  润新知