走进Linq-Linq to SQL How do I(3)

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进Linq-Linq to SQL How do I(1)

走进Linq-Linq to SQL How do I(2)

走进Linq-Linq to SQL How do I(3)

走进Linq-How do I(4)拾遗补零篇第一节

走进Linq-Linq to SQL源代码赏析 Table的获取过程

走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq


NHibernate是使用XML作为映射的配置文件,Caslte中的ActiveRecord(底层还是使用NHibernate)是使用Attribute的方式做映射配置。一个是非侵入的,一个是侵入的。有人喜欢用XML做配置,说这样灵活,修改配置无需重新编译,有人喜欢使用Attribute的配置方式,说这样可维护性好,可以得到编译期的检查。

不过在Linq里,这一切都不是问题。Linq to SQL这几种方式都支持,而且走的更远。

纯Attribute方式配置

XMl文件的配置方式

使用SqlMetal命令行工具生成配置代码

使用Visual Studio的设计器生成映射配置代码

纯Attribute方式配置

前面几篇我们都是使用这种Attribute的方式的,在Linq to SQL的第一篇我就介绍了,这些映射的Attribute都存在于System.Data.Linq.Mapping命名空间下。在前面我们已经出现了TableAttribute,ColumnAttribute, AssociationAttribute。实际上还有DataBaseAttribute,ProviderAttribute,FunctionAttribute。本篇后面的内容将在不同的地方对他们做全面的介绍。

Table

Table特性是加在类上面的,不能重复的加,也不能继承。Table,顾名思义,就是用来定义类和数据库表之间的映射的,Table是映射定义的关键点,如果没有给一个类加上Table特性,那么即使这个类里面的属性或字段加上了Column也是无效的,实际上,前面几篇中的例子,如果没有给映射类加Table特性在运行时会抛出一个异常:System.InvalidOperationException,说你的类没有映射为一个Table。Table特性只有一个属性Name,用于在你的类名和数据库表名不同的时候来定义。

Column

Column特性就复杂得多了。不过可喜的是,这些属性的命名都很好,只要见到名字了,基本上就能把意思给猜出来了。

AutoSync

AutoSync:自动同步。这个属性是一个枚举类型:

 

public enum AutoSync
{
Default,
Always,
Never,
OnInsert,
OnUpdate
}

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进Linq-Linq to SQL How do I(1)

走进Linq-Linq to SQL How do I(2)

走进Linq-Linq to SQL How do I(3)

走进Linq-How do I(4)拾遗补零篇第一节

走进Linq-Linq to SQL源代码赏析 Table的获取过程

走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq


实际上我们可以看看,这个AutoSync是如何影响Linq to SQL的行为的(打开前面我们曾经建的那个博客园的例子,如果你没有创建一个强烈建议你回到前几篇按照那里的步骤新建)

我们执行一下对Post的插入:

DataContext dbContext = new DataContext(ConfigurationManager.ConnectionStrings["CnBlogs"].ConnectionString);
dbContext.Log
= Console.Out;

var post
= new Post {

BlogId
= 1,

Title
= "Linq to SQL How do I(3)",

Body
= "废话一堆",

};
dbContext.GetTable
<Post>().InsertOnSubmit(post);
dbContext.SubmitChanges();

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进Linq-Linq to SQL How do I(1)

走进Linq-Linq to SQL How do I(2)

走进Linq-Linq to SQL How do I(3)

走进Linq-How do I(4)拾遗补零篇第一节

走进Linq-Linq to SQL源代码赏析 Table的获取过程

走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq


CanBeNull

这个属性可以指定对应的数据库表的列是否允许是null的,如果这个列不能为null,那你给这个属性赋个null的时候,是要触发异常的。不过要记住,null并不代表是一个空字符串或者零,关于null的更多内容,你可以参见园子Anytao的佳作。

DbType

如果你想使用DataContext的CreateDataBase方法从映射类创建数据库表,那么最好指定这个,这样你就可以明确的指定出你的这个列在数据库表中的DbType是啥,不然Linq to SQL会从属性的类型推断DbType,这有可能不怎么适合,比如这个string类型:

[Column(DbType="NVarchar(50) not null")] public string Title { get; set; }

在这里我们是不是发现了,我们还可以从映射类创建数据库,都说ORM是以O为主,可我们实践的时候总是先建立数据库,然后根据数据库创建Object,那这不是ROM了么,从这里的信息表示,你可以先设计好Domain Object,并建立好Object之间的关系,最后使用CreateDataBase方法来创建数据库表。关于CreateDataBase更多的信息在后面我会更进一步的说明的。

Expression

我只能说Linq to SQL做的太周到了,连这个都考虑了。Expression用来表示一个计算列,什么意思?意思是这个属性是数据库表的列通过计算获取的,比如,假如我们数据库里有一列price存储的是美元,可是取出来的时候我们要求用人民币表示:

[Column(Expression="price * 6")] public float Price { get; set; }

上面的例子只是用来说明Expression这个属性的用途,而这个例子的做法实在是不可取,对于美元转人民币这种汇率问题,汇率是时刻波动的,所以这样硬编码,实在是糟糕的很,各位读了以后BS一下,一笑而过吧。

IsDbGenerated

从名字上就可以看出来了,这个表明这个属性的值是数据库产生的,不需要我们的程序赋值,比如这个自增的列,比如这个有默认值的列(时间,我们可以用SQL getdate()函数设置值,而无需我们在程序里指定)

IsPrimaryKey

是主键吗?如果是就要指定这个属性了,如果你的主键是多个列组成的,那么就在多个属性上加吧。关于主键,在后面还会进一步介绍。

IsVersion和UpdateCheck

这两个在这里就不说了,后面会有大篇幅的介绍的。这个Column特性是从抽象特性Data继承来的,从这个特性继承了两个属性:

Name

这个是当你的属性名字和这个列名不一致的时候指定列名用的。

Storage

有的时候啊,你的属性里的set里面应用了复杂的业务逻辑,而Linq to SQL在将值从数据库取出,然后赋值给这个属性的时候,默认是要使用这个set的,这个时候在这种情况下(从数据库取值赋给类的属性),你并不想执行这个set里面的逻辑,想把这个值直接给属性背后的那个私有字段:

private float _price;
/// <summary>
/// 由于某些原因,当从数据库取值给Price属性的时候
/// 你不想给这个值乘以20
/// </summary>
[Column(Storage="_price")]
public float Price
{
get { return _price; }
set{_price = _price * 20;
}

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进Linq-Linq to SQL How do I(1)

走进Linq-Linq to SQL How do I(2)

走进Linq-Linq to SQL How do I(3)

走进Linq-How do I(4)拾遗补零篇第一节

走进Linq-Linq to SQL源代码赏析 Table的获取过程

走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq


Association

这个特性是用来建立实体之间关系的。在前面的例子里我们看到了:

/// <summary>
/// 一个博客有零篇或多篇文章,
/// </summary>
[Association(ThisKey="Id",OtherKey = "BlogId")]
public EntitySet<Post> Posts { get; set; }

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进Linq-Linq to SQL How do I(1)

走进Linq-Linq to SQL How do I(2)

走进Linq-Linq to SQL How do I(3)

走进Linq-How do I(4)拾遗补零篇第一节

走进Linq-Linq to SQL源代码赏析 Table的获取过程

走进Linq-Linq to SQL源代码赏析之Provider的初始化

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq


我们就来看看这个XML映射文件的格式:

<?xml version="1.0" encoding="utf-16"?>
<Database Name="Cnblogs" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
<Table Name="posts">
<Type Name="Yuyijq.Linq.Cnblogs.Domain.Post">
<Column Name="postid" Member="Id" IsPrimaryKey="true" IsDbGenerated="true" />
<Column Name="blogid" Member="BlogId" />
<Column Name="title" Member="Title" />
<Column Name="body" Member="Body" />
<Column Name="createdate" Member="CreateDate" IsDbGenerated="true"/>
</Type>
</Table>
</Database>

it知识库走进Linq-Linq to SQL How do I(3),转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。