作甚?

先说说这个工具是干啥的,我们所做的程序,或多或少需要存储一些数据到数据库,当然直接使用Sql语句也可以,甚至有些情况下就是要使用sql语句,但对于一些基本的增删改查,对每张表都要写查询语句就显得效率低下了,并且查询出来的数据没有映射成对象,我们自己还要去转换一次,显得麻烦。这个时候就有很多很多ORM框架出现了,按我浅薄的理解就是将数据库中的表映射成代码中对象,增删改查都用对象封装起来,用起来就很舒服,当然映射这些工作必须是自动完成的,能够根据数据库的表结构自动生成,今天介绍的SqlMetal.exe就是其中一种。

SqlMetal.exe

这个工具安装了vs就会有,它的路径在

c:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\下,命令很多,功能也很强大,粗糙的用法就是,先有了数据库,然后用这个工具去根据这个数据库生成相应的对象模型代码文件,我们把这些文件包含进我们的程序,就能够对数据库进行操纵了。

sqlmetal /conn:"Server=np:\\.\pipe\LOCALDB#88239602\tsql\query;Database=Northwind;Integrated Security=true" /dbml:../Northwind.dbml

SqlMetal /code:../Northwind.cs /map:../Northwind.map ../Northwind.dbml

第一句命令,是告诉SqlMetal链接字符串/conn:,他会根据这个数据库生成一个dbml文件/dbml:

第二句命令,就是根据这个dbml文件生成类文件和其他文件,我们把生成出来的文件都包含进代码中。

增

我们发现数据库中有这张表Customers,而程序中也有了一个Customers对象,所以我们来增加一个客户信息

private static Northwind _db = new Northwind(@"Server=np:\\.\pipe\LOCALDB#0FA0957B\tsql\query;Database=Northwind;Integrated Security=true");

    static void Main(string[] args)
{
var customer = new Customers()
{
Address = "KunMing",
City = "YunNan",
CompanyName = "999",
ContactName = "Bob",
ContactTitle = "Owner",
Country = "China",
Fax = "030-0076545",
Phone = "030-0074321",
PostalCode = "12209",
CustomerID = "SIMOC",
}; _db.Customers.InsertOnSubmit(customer);
_db.SubmitChanges();
}

改

private static Northwind _db = new Northwind(@"Server=np:\\.\pipe\LOCALDB#0FA0957B\tsql\query;Database=Northwind;Integrated Security=true");

    static void Main(string[] args)
{
var customer = _db.Customers.FirstOrDefault(x => x.CompanyName == "999"); if (customer != null)
{
customer.CompanyName = "888";
_db.SubmitChanges();
}
}

删

private static Northwind _db = new Northwind(@"Server=np:\\.\pipe\LOCALDB#0FA0957B\tsql\query;Database=Northwind;Integrated Security=true");

    static void Main(string[] args)
{
var customer = _db.Customers.FirstOrDefault(x => x.CompanyName == "888"); if (customer != null)
{
_db.Customers.DeleteOnSubmit(customer);
_db.SubmitChanges();
}
}

查

private static Northwind _db = new Northwind(@"Server=np:\\.\pipe\LOCALDB#0FA0957B\tsql\query;Database=Northwind;Integrated Security=true");

    static void Main(string[] args)
{
var customer = _db.Customers.FirstOrDefault(x => x.CompanyName == "888");
}

视图和存储过程

这些都是简单的操作,给我们节省了很多时间,但LinqToSql用于多表联合查询时,特别是带统计的查询时,效率就会有所下降,为什么呢,一般我们在写linq语句的时候,如下面这种:

var customer = from c in _db.Customers where c.CompanyName == "888" select c;

它是会等待真正使用数据的时候才去查询,如.ToList方法,Count方法的时候,当我们使用LinqToSql的时候,一旦分组统计中使用了.Count方法,那么它就会执行一次查询,试想,如果有很多行需要统计的数据,那么是不是要查询很多次,就网络中的延迟就会导致这个查询效率很低,解决的办法就是使用存储过程or视图。SqlMetal同样可以生成视图和存储过程,我们在数据库中添加简单的视图和存储过程

create view View_custome
as
select * from dbo.Customers
go create proc Proc_GetCustomerById(
@Id nvarchar(100)
)
as
select * from dbo.Customers where CustomerID=@Id
go

然后修改上面的命令为:

sqlmetal /conn:"Server=np:\\.\pipe\LOCALDB#0FA0957B\tsql\query;Database=Northwind;Integrated Security=true" /dbml:../Northwind.dbml  /views /functions /sprocs

重新生成

 var viewResult = _db.View_custome.ToList();

var procResult = _db.Proc_GetCustomerById("ALFKI").FirstOrDefault();

视图和存储过程都能使用啦,是不是觉得很方便。

如果有错误的地方还请指正。

SqlMetal.exe ORM代码生成的更多相关文章

  1. 设置数据库为SINGLE_USER模式,减少锁定时间

    --SQL Server开启READ_COMMITTED_SNAPSHOT ----设置数据库为SINGLE_USER模式,减少锁定时间 ALTER DATABASE ENDV_SOA SET SIN ...

  2. SOS.dll(SOS 调试扩展)

      SecAnnotate.exe(.NET 安全批注器工具) SignTool.exe(签名工具) Sn.exe(强名称工具) SOS.dll(SOS 调试扩展)   SqlMetal.exe(代码 ...

  3. .NET Framework 工具

    您可以使用 .NET Framework 工具轻松创建.部署和管理面向 .NET Framework 的应用程序和组件. 此节中介绍的大部分 .NET Framework 工具将自动随 Visual ...

  4. 使用sqlmetal工具自动生成SQL数据库的Linq类文件

    第一部:找到sqlmetal.exe. 运行cmd. 执行命令 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5 ...

  5. 2014年4月份第3周51Aspx源码发布详情

    WPY净水机网站源码  2014-4-14 [VS2008]源码描述: 实现产品展示,在线留言,信息发布,在线咨询,营销网络地图. 网站基本管理:网站banner管理 管理首页滚动图片信息 网站右下部 ...

  6. myGeneration代码生成器

    转自:http://www.cnblogs.com/leitwolf/archive/2007/07/27/833255.html http://blog.csdn.net/happyhippy/ar ...

  7. sql2000下如何新建并使用dbml

    默认新建的dbml只是支持sql2005及其以上版本. 但是现在是sql2000怎么办?我要是想要用linq to sql 的? 解决方案如下: 1首先打开cmd,在其中cd到sqlmetal.exe ...

  8. WCF技术剖析之十一:异步操作在WCF中的应用(上篇)

    原文:WCF技术剖析之十一:异步操作在WCF中的应用(上篇) 按照操作执行所需的资源类型,我们可以将操作分为CPU绑定型(CPU Bound)操作和I/O绑定型(I/O Bound)操作.对于前者,操 ...

  9. Windows 编程,程序编译使用的命令行工具。

    Windows 编程,程序编译使用的命令行工具. 1.cl.exe文件是Visual C\C++的编译器,它将程序源代码文件编译为obj文件. 2.rc.exe文件是资源编译器.工程项目中的.rc文件 ...

随机推荐

  1. 《IBM BPM实战指南》读书笔记

    理论 BPM不是一个IT术语,更不是因技术的发展而起源的,相反,BPM自始至终都是管理学的术语和概念.它关注的一直都是效率.成本.利润.质量等核心问题.BPM是一门学科和一种方法论,只是现代的企业管理 ...

  2. SharePoint 2013 工作流之使用Designer配置示例篇

    在SharePoint 2013中,支持SharePoint Designer 2013(以下简称SPD)配置简单的工作流,完成我们的业务需要.下面,我们就举一个小例子,实现SPD配置工作流. 1. ...

  3. IOS开发基础知识--碎片2

    六:获得另一个控件器,并实现跳转 UIStoryboard* mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboa ...

  4. React Native知识7-TabBarIOS组件

    一:简介 两个TabBarIOS和TabBarIOS.Item组件可以实现页面Tab切换的功能,Tab页面切换的架构在应用开发中还是非常常见的.如:腾讯QQ,淘宝,美团外卖等等 二:TabBarIOS ...

  5. Android RecyclerView.Adapter notifyDataSetChanged 不起作用

    我在自己动手写RecyclerView的上拉加载更多,最后就差一步,这个时候数据已经加载完了,UI上面没有显示,我而且也调用了notifyDataSetChanged刷新item的数据,但是一直没效果 ...

  6. iOS 疑难杂症 — — 在 Storyboard 里 Add Size Class Customization 后再从代码里无法修改的问题

    前言 公司的产品同时适配 iPhone 和 iPad ,并坚持用 Storyboard 来做适配,今天又踩一个坑(以前遇到过)还以为是 XCode 的鬼毛病. 声明  欢迎转载,但请保留文章原始出处: ...

  7. php设计模式 装饰器模式

    装饰器模式,可以动态地添加修改类的功能. 一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式需要写一个子类继承它,并重新实现类的方法.使用装饰器模式,仅需要在运行时添加一个装饰器对象即可 ...

  8. JVM之PC寄存器(Program Counter Register)

    基本特性: 当前线程执行的字节码的行号指示器. Java虚拟机支持多个线程同时执行,每一个线程都有自己的pc寄存器. 任意时刻,一个线程都只会执行一个方法的代码,称为该线程的当前方法,对于非nativ ...

  9. oracle行转列与列转行

    一.行转列 在有些应用场景中,如学生成绩.学生所有科目的成绩都保存到一张表里面,当我们需要以列表的形式显示出学生所对应的每一科目的成绩的时候,需要使用到行转列. 示例 -- 学生成绩表 create ...

  10. c#中对txt文件的读取与写入,针对二维数组

    class Program { ; ; static string[,] str = new string[ROW, COL]; static void Main(string[] args) { R ...