使用O/R Designer生成对象模型 http://msdn.microsoft.com/zh-cn/library/bb384429.aspx
使用SqlMetal.exe生成对象模型http://msdn.microsoft.com/zh-cn/library/bb386987.aspx
通过O/R Desginer或SqlMetal,你不但可以生成实体类的定义,而且还生成了一个DataContext的派生类,名称为 xxxDataContext(xxx为默认数据库的名称,也可以自行定义)。在文章开始的代码中,我们通过 DataContext.GetTable<Customer>()来获取操作Customer表的表对象,但在 xxxDataContext类中提供了更方便的方法,通过访问xxxDataContext类中包含的Customers属性即可。
需要注意的是,在SqlServer中你允许设计一张没有主键标识(Primary key)的数据表,但是在定义entity class的属性时,必须至少包含一个的主键属性(IsPrimaryKey=true)。这不单是数据库设计标准的要求,DataContext对象会使用PrimaryKey属性值作为实体对象的唯一标识,用来进行实体对象的生命周期管理,详见LINQ那些事(6)。
我不建议你使用手写的方法来定义entity class,甚至是必须用O/R Designer或Sqlmetal来生成entity class,因为对于包含关联关系(Association)的entity class,自动生成的代码中还包含了维护Association的代码,这对LINQ2SQL实现级联操作是非常关键的(你可以看看生成的 Customer类的代码,它如何维护Orders属性)。
还有一个问题是通过Attribute标签和Xml映射文件来定义映射关系,孰优孰劣的问题,这已经是一个老问题了。听到最多的是,有人说大项目用 XML方式,小项目用Attribute方式,我觉得那纯粹是瞎扯淡,但XML方式的确有一个好处就是有时当数据库发生更改时,我们直接修改XML就可以了,而无需重新编译代码,其他的更多就是习惯问题了。在这一系列的文章中,我都采用了XML的方式来定义,文章开始的代码示例了如何由XML来创建 DataContext对象,你只需把DataContext改成xxxDataContext即可。
顺便提供几个非常常用的sqlmetal参数组合:(拷贝时注意去掉northwnd.和cs之间的断行)
* 1、生成本地数据库文件的映射:sqlmetal "northwnd.mdf" /code:northwnd.
cs /map:northwnd.xml /namespace:LinqAttach /context:Northwnd /pluralize
* 2、通过链接字符串:sqlmetal /conn:”server=myserver; database=northwind” /code:northwnd.
cs /map:northwnd.xml /namespace:LinqAttach /context:Northwnd /pluralize
* 3、通过指定数据源:sqlmetal /server:myserver /database:northwnd /password:pwd /code:northwnd.
cs /map:northwnd.xml /namespace:LinqAttach /context:Northwnd /pluralize
说明:
/code:指定包含生成实体类和派生DataContext类的cs代码的文件路径
/map:指定生成xml映射文件路径
/namespace:指定生成的cs代码所在的命名空间
/context:指定生成的派生DataContext类的类名
/pluralize:指定sqlmetal根据英文单/复数规则来生成实体类和属性的名称,非常靠谱。