LINQ快速开发设计最佳实践(二) 构建Model模型

一.摘要

第一篇文章我简要介绍了项目的设计框架和LINQ实现思想. 本篇文章将是最实际和具有技巧性的地方, 就是如何创建LINQ TO SQL 的模型对象.

二.
前言1.LINQ与LINQ TO SQL

姜敏同学提醒我要注意LINQ TO SQL和LINQ的不同.的确这两者就类似C#和.NET. 老赵曾写文章特别强调过两者的不同.这里再简单提一下.

LINQ是Language-Integrated Query的缩写, 翻译后是"集成语言查询", 我将LINQ看做是一种查询框架, 拥有自己的特定语法. 只要对象实现了LINQ框架所需要的接口, 就可以使用LINQ语法进行查询.比如:

Code

var query =

from tagCategory in dc.TagCategory

where tagCategory.pkid == tagCategoryId

select tagCategory

LINQ TO SQL 是一个LINQ Provider, 能够实现轻量级的ORM, ORM的作用是将数据库中的表和Model模型做映射, 比如Java中的Hiberate(.NET中也有NHiberate). LINQ TO SQL让我们可以使用LINQ的语言操作Model对象, 完成对数据库的CRUD操作.

为何我们可以使用LINQ语言查询一个Object? 因为有LINQ TO Object.

为何我们可以使用LINQ语言查询对象操作数据库? 因为我们有LINQ TO SQL.

2.LINQ TO SQL 的Model对象

传统的Model对象是一种信息模型, Model类一般不包含任何的方法, 只包含属性.要描述一个现实世界Student, 首先需要一个Student的Model类, 比如类名就叫做Student, 用来保存每一个Student特有的信息, 比如名字.  然后将其具有的行为在业务逻辑层描述, 比如在业务逻辑层创建一个StudentBL类, 为其添加一个Walk()方法.  现在比较流行使用业务模型设计系统, 业务模型会将信息和行为抽象成一个Student角色.但是我还很少使用.

使用LINQ TO SQL, 我们能将传统意义上的Model模型的某一个属性, 比如Student类的Name属性与数据库Student表的Name字段建立映射关系,  这就是ORM: 对象Object 关系Relational 映射Mapping 的含义. 有了ORM, 当我们修改Student的Name时,将自动修改数据库中的数据. 我们再也看不到SQL了, 系统中统统都是操作对象.

LINQ TO SQL 提供了可视化设计工具"O/R 设计器"和命令行工具SqlMetal.exe 为数据库中的表自动生成Model类代码. 但是默认生成的代码只能做做简单的Demo例子, 在实际应用中有很多问题和需要修改的地方.下面将我创建一个Model对象的的"最佳实践"拿出来和大家分享.

三. 使用工具建立Model类

在架构上我将Model类横向切割为一层, 纵向将每个业务线切割为一个项目.比如Tag系统的模型层为: Com.Elong.Model.Tag

每个项目首先都要为每个表创建Model类, 这一步我会使用O/R设计器的可视化设计.下面简单介绍一下步骤.

1.使用 O/R 设计器

在项目中添加新项是, 我们选择"LINQ TO SQL类",如下图:

我们会在项目中添加TagDataContext.dbml文件, 展开此文件的"+"会发现其包含两个子文件: TagDataContext.dbml.layout以及TagDataContext.design.cs

其中 TagDataContext.design.cs 中保存我们的DataContext类和所有表的Model类代码. TagDataContext.dbml.layout保存的是可视化设计的一些信息.

双击 TagDataContext.dbml 文件会进入可视化设计阶段. 使用O/R设计器十分简单, 在此不做介绍.想学习的可以参考MSDN或者一些前辈的系列教程,无非就是拖拖拽拽的工作.下面是一张O/R设计器截图:

提供下面几个技巧和经验:

1.如果想自动创建数据库中两个表的关系, 需要将这两个表同时拖出.

2.单击设计器空白处,查看属性面板, 有很多属性可以在这里修改:

最有用的上下文命名空间 和 实体命名空间. 上下文命名空间是DataContext类的命名空间, 我通常将其放置在DataAccess层中.实体命名空间是所有Model类所在的命名空间, 我将其放置在Model层中.

3.任何在可视化设计中的修改, 都会造成 .design.cs 文件重写, 所以现阶段不要手工对此文件做修改. 因为一旦作了修改将不能再使用O/R 设计器.

4.O/R 设计器允许我们创建一个不会重写的类来扩成自动生成的代码,创建方法是在O/R设计器的空白处点右键, 在弹出菜单中选择"查看代码",如图:

会在.dbml文件中添加一个.cs文件:

请一定要创建这个文件,因为以后我会将Model类的方法创建在这个文件中.

四.使用SqlMetal.exe工具

上一章中已经提到过SqlMetal.exe,它是一个命令行工具, 需要从Visual Studio的命令行中使用.也会生成DataContext和Model类的代码.比如:

Code

Sqlmetal /conn:"uid=****;pwd=****;initial catalog=DataBaseName; data source=192.168.0.1; Connect Timeout=900; Connection Reset=FALSE" /code:"d:\DB.cs"

DB.CS中会有包含了是数据库所有表的DataContext以及每一张表的Model类.

一旦我们对可视化设计生成的.Design.cs文件作了修改, 比如添加了注释, 那么请不要再使用 O/R 设计器进行可视化的更改.正确的做法是手动的修改.Design.cs中的代码, 对于新加表等工作量比较大的修改, 可以先使用SqlMetal.exe生成表对应的Model类的初始代码, 将其Copy到.Design.cs中,然后再自行修改.

五.修改 TagDataContext.Design.cs 文件

在Design.cs中, 我们要做下面几项修改:

1.修改Model类名

修改Model类名称,以及Model类Table特性的值,去掉其中的"用户."前缀.添加注释.下面是一个例子.

修改前:

Code

[Table(Name = "dbo.T_Activity")]

public partial class T_Activity

修改后:

Code

///

/// 活动表.保存各种活动信息

///

[Table(Name = "T_Activity")]

public partial class Activity
2. 添加所有属性的默认值和注释.

以ActivityName属性为例.

添加默认值:

Code

private string _ActivityName = string.Empty;

添加注释:

Code

/// /// 活动名称

/// [Column(Storage = "_ActivityName", DbType = "NVarChar(200) NOT NULL", CanBeNull = false)]

public string ActivityName

3.在主键列的Column特性上添加IsVersion属性,值为true

比如:

Code

/// <summary>/// 自增主键/// </summary>

[Column(Storage = "_pkid", AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true, IsVersion = true)]

public int pkid

这一条相当重要.否则使用LINQ会遇到很多问题.当然也可以建立一个额外的TimeStamp列来用做IsVersion列,但是比较麻烦.

对于主键来说, AutoSync属性应该设置为 OnInsert, 实现的功能就是当我们将想要Insert一个对象时, 在插入前并没有对象的主键ID为null或默认值, 但是当调用DataContext完成Insert操作后, 此对象的主键ID属性会被自动被填充.

3.将使用数据库默认值的模型属性上,添加Column(IsDbGenerated=true)

比如:

Code

[Column(Storage = "_CreatedTime", DbType = "DateTime NOT NULL", IsDbGenerated=true)]

public System.DateTime CreatedTime

{ }

CreatedTime是数据库中使用getDate()在创建时写入的,我们希望使用数据库中的值.而不是在程序中更新.注意使用LINQ更新的是对象,如果使用默认的代码并且没有添加IsDbGenerated, 则数据库中的getDate()将失效.

4.修改DataContext类

如果我们添加了新的表, 除了修改.Design.cs中的Model模型类,还需要修改同样在此文件中的DataContext类.假设我们要添加一个Activity表,则需要在DataContext类中增加下面代码:

时间: 2024-09-20 23:32:12

LINQ快速开发设计最佳实践(二) 构建Model模型的相关文章

移动端设计最佳实践

本文讲的是移动端设计最佳实践, App 已经成为了能够可靠地展现内容并提供服务的主流平台.但在琳琅满目的 App 市场中,一个移动应用要怎么做才能称得上实用.贴近用户并且具有价值,又能满足并留住用户呢? 本文将介绍 7 个能够提供绝佳移动应用用户体验的 UX 设计准则. 1. 一个界面,一个任务 让用户以更少的步骤完成他们想要的操作 你的 App 中的每一个界面都应该支持使用者仅需操作一次,便可达到目的.每个界面都应该设计成为某一独立功能而服务的,并且不需要做超过一次的交互操作.这样的设计使得用

值得学习总结的网页导航设计最佳实践

  优质的网页设计通常都有着相当不错的导航设计来支撑.如果你的网站有着有趣的内容和受欢迎的视觉设计,那么一个体验良好,可用性优异的导航栏无疑是必须的.可用和易用一直是高效交互的核心,也是激发创意.创造高效设计和优秀视觉设计的基础.所以说,是时候重新审视你的菜单和导航设计,尽量以简约的方式将它们重新组织起来. 导航是必不可少的.高素质是网站导航是让网站从不错走向卓越的必经之路.在今天,千变万化的网页导航设计开始趋于系统化.规则化,网页导航的最佳实践也并非虚无缥缈的都市传说,而今天我们要聊的也就是这

给大家推荐一本学习Web Service开发的最佳实践教程

问题描述 给大家推荐一本学习WebService开发的最佳实践教程.CSDN上传不了,PDF版下载地址http://down.51cto.com/data/265669 解决方案 解决方案二:现在不用下载了,这个地址可以看书的视频http://school.itzcn.com/special-spid-60.html解决方案三:下载下来的内容不全啊,才两章解决方案四:该回复于2011-12-23 09:05:24被版主删除解决方案五:你发不我的箱邮吧.ADDR:[email=c_oo_p@sin

20个数据库设计最佳实践

数据库设计是整个程序的重点之一,为了支持相关程序运行,最佳的数据库设计往往不可能一蹴而就,只能反复探寻并逐步求精,这是一个复杂的过程,也是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程.下面给出了20个数据库设计最佳实践,当然,所谓最佳,还是要看它是否适合你的程序.一起来了解了解吧. 使用明确.统一的标明和列名,例如 School, SchoolCourse, CourceID. 数据表名使用单数而不是复数,例如 StudentCourse,而不是StudentCourses. 数

SQL Server 2005报表设计:最佳实践和指导

本文包含了Microsoft SQL Server报表服务报表设计的技巧和最佳实践.本文提供一些基本的设计问题和一些报表服务的功能. 关于这篇文档 从使用数据控件,到使用什么格式,到如何分发报表,报表制作者面对着很多种选择.Microsoft SQL Server 报表服务提供了丰富的报表设计和格式的支持,从基于纸介质表格报表到带有图片和钻取功能的交互式报表 这篇文档包括了报表制作和设计中的指导.建议和技巧.本文档的目的在于解释一般性的问题并对初学者提供指导建议.报表服务联机丛书提供了报表的制作

RESTful API 设计最佳实践

Web API 近几年变得越来越火,而简洁的 API 设计在多后端系统交互应用中也变得尤为重要.通常,会使用 RESTful API 来作为我们的 Web API .本文介绍了几种简洁 RESTful API 设计的最佳实践. 使用的名词而不是动词 使用名词来定义接口 资源 GET PUT POST DELETE 一组资源的URI,比如http://www.waylau.com/resources/ 列出 URI,以及该资源组中每个资源的详细信息(后者可选). 使用给定的一组资源替换当前整组资源

MaxCompute多团队协同数据开发项目管理最佳实践

MaxCompute多项目管理最佳实践 背景介绍: 厦门美柚科技有限公司,创始于2013年4月,是一家专注为女性服务的互联网公司.秉承"让女人更美更健康"的理念,美柚以经期管理为切入点,为女性提供备孕.怀孕.育儿.社区交流等功能服务.目前,美柚用户超过1亿,日活跃用户近千万,拥有约160个高活跃的女性话题圈,社区内用户日均互动量超500万帖,日均浏览量超过1.8亿次.之前各种数据开发.数据支持.数据挖掘都在同一个项目中,随着公司业务线的不断扩充,规模的不断壮大,参与大数据开发的部门(团

RDS最佳实践(二)—如何快速平稳的迁入RDS

在上一篇中大致介绍RDS的一些基本参数,包括数据库类型,版本,存储空间,规格:内存,连接数,io,地域等基本含义,本篇中将介绍如何快速平稳的迁入RDS. 用户在购买完RDS后,接下来就可以开始往RDS迁入数据了.在RDS刚刚对外提供服务的时候,用户只能通过将自己的数据库dump成为sql文件,然后再将sql文件source到RDS中去:数据迁移至RDS-MySQL之使用MySQLdump工具,数据迁移至RDS-SQLserver之利用SQL Server客户端工具,这两种方法是最简单的方法,但是

Hadoop+Spark+MongoDB+MySQL+C#大数据开发项目最佳实践

随着IT技术的飞速发展,各行各业都已在广泛尝试使用大数据技术提供更稳健和优质的服务.目前,医疗IT系统收集了大量极具价值的数据,但这些历史医疗数据并没有发挥出其应有的价值.为此,本文拟利用医院现有的历史数据,挖掘出有价值的基于统计学的医学规则.知识,并基于这些信息构建专业的临床知识库,提供诊断.处方.用药推荐功能,基于强大的关联推荐能力,极大地提高医疗服务质量,减轻医疗人员的工作强度.   二.Hadoop&Spark  目前大数据处理领域的框架有很多.   从计算的角度上看,主要有MapRed