LINQ to SQL 建立实体类 (转)

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

使用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();
        }
    }
}

程序的运行如下:

时间: 2024-10-14 00:34:16

LINQ to SQL 建立实体类 (转)的相关文章

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控

.net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类

在开发中可能会遇到这几种情况 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要先建一个类 ,头痛 4.如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类 为了解决上面的不便之处,我封装了一个实体生成类,可以扔到程序里面任意调用 封装类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

模拟实现MyBites中通过SQL反射实体类对象功能

话不多说,直接上干货! package cn.test; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Timestamp; impor

Hibernate格式化sql语句实体类 BasicFormatterImpl 源码

package com.util; import java.util.HashSet; import java.util.LinkedList; import java.util.Set; import java.util.StringTokenizer; public class BasicFormatterImpl { private static final Set<String> BEGIN_CLAUSES = new HashSet<String>(); private

Linq的整型或实体类null引发的报错问题

经常在程序中遇到两个空值报错问题: 问题1:int类型如果为不可空,假如传进去null,会报错 问题2:EF的获得单个实体的Model如果为空,那么后面如果跟上属性会报错 解决问题1: 一般属性都设为可空 再自己封装一个 Toint方法,如果对象为null,则转换为0(或者使用.net类库自带的方法GetValueOrDefault()) 解决问题2 下图为获得单个实体的方法,需要传入不为空的整形 在调用时可 areaapp.GetForm(id.ToInt()) 解决调用空实体实体后检索里面属

SSH框架中新建立实体类后的配置

strut 层 public class Sellauthentication extends ActionSupport {    private SellauthenticationService SellauthenticationService;              public SellauthenticationService getSellauthenticationService() {        return SellauthenticationService;  

ADO,NET 实体类 和 数据访问类

啥也不说,看代码. --SQl中 --建立ren的数据库,插入一条信息 create database ren go use ren go create table xinxi ( code nvarchar(20) primary key,--编号 name nvarchar(20)--名字 ) insert into xinxi values('1001','zhangsan') 1.建立实体类: 实体类:封装封装一个类,类名与数据库表名一致成员变量名与列名一致,多一个下划线成员变量封装完的

动态生成实体类

转载: .net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类 在开发中可能会遇到这几种情况 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要先建一个类 ,头痛 4.如果通过代码生成器要写模版,需要安装或者不想生成一堆不用的类 为了解决上面的不便之处,我封装了一个实体生成类,可以扔到程序里面任意调用 封装类: using System; usi

eclipse逆向生成实体类

(转自:http://blog.csdn.net/wangpeng047/article/details/6877720) 做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再"自己"建立一变VO.意思是,在项目设计时,要么根据需求分析建立实体类,由正向生成数据库表:要么就先进行数据库表设计,再逆向生成实体类.没有说进行完任意一方的设计后再去花时间去自己匹配建立另一方的设计. 原因是: