您的位置:首页 > 数据库

LINQ to SQL系列Part 2 - Defining our Data Model Classes

2007-12-18 16:09 357 查看
LINQ to SQL系列Part 2 - Defining our Data Model Classes
本文转载自:
http://www.cnblogs.com/hanxianlong/archive/2007/11/17/960914.html

英文原贴链接:
http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx

在我的LINQ to SQL系列博客的第一部分(Part 1)我讲解了“什么是LINQ to SQL"并且提供了一些LINQ to SQL能支持的数据环境。

在我的第一篇帖子中,我提供了展示如何用LINQ to SQL来进行一些常用的数据处理,包括如下几个方面:

如何查询数据库

如何更新数据库中的行

如何在数据库中插入并操作关联操作数据行

如何在数据库中删除记录

如何调用存储过程

如何查询在服务器端分页的数据

所有的这些数据操作,我都是在如下的这个LINQ to SQL 类模型中进行的:





在本系列的第二篇帖子中,我将更具体地讲解一下如何生成上面这个LINQ to SQL 数据模型。LINQ to SQL设计器,和我在这个博客系列中提到的所有特性都是.NET 3.5中和VS "Orcas"版本中的一部分。

你可以从Visual Studio "Orcas" Beta 1或Visual Web Developer Express "Orcas" Beta1中下载来跟着如下的操作,两个个都可以和VS2005一起安装。

新建一个新的ILNQ to SQL数据模型

你可以向ASP.NET,类库或Windows客户端的项目中按照如下方式添加LINQ to SQL数据模型:点击"Add New Item"选项,在弹出的对话框中选择“LINQ to SQL"项:





选择"LINQ to SQL"项将会弹出"LINQ to SQL"设计器,然后允许你***一个代表了关系型数据库的模型类。它还会生成一个强类型的"DataContext"类,该类会有代表了我们从数据库以代表了我们数据库的每一张数据表的属性,代表了我们数据库中的存储过程的方法。如我在该系列的Part 1 中描述的那样,DataContext类是我们从数据库中查询以及将更新存回至数据库中的一个主要管道。

下面是一个空LINQ to SQL 的ORM设计器的屏幕截图,也是在生成了一个新的LINQ to SQL数据模型之后你首先会看到的:





实体类

LINQ to SQL 使你***一个映射了或映射到数据库的类。这些类被有称为“实体类”并且它们的实例被“实体”。实体类映射了数据库中的数据表。实体的属性映射到表的列。每个实体代表了数据表中的一行记录。

用LINQ to SQL定义的实体类不用必须继承自某一个特定的基类,这说你可以让它继承自任何一种对象。所有用LINQ to SQL设计器生成的类都被定义为了"局部类“,这意味着你可以选择向局部类中添加代码和添加附加的属性,方法和事件。

和VS2005中提供了DataSet/TableAdapter不同,当用LINQ to SQL设计器时,你不必在生成数据模型和访问层时指明SQL查询语句。

相反,你只需要将注意力集中到你的实体类,以及它们如何映射到/从 数据库,和它们之间的关系上。LINQ to SQL OR/M将会注意如何在你和和该类交互并使用数据实体时生成合适的SQL执行语句逻辑。你可以用强类型的方法来通过LINQ 查询语法来表达如何从数据模型中查询。

从数据库中生成实体类

如果你已经有了一个已定义好的数据库模型,你可以用它很快地来生成一个脱离于它的LINQ to SQL实体类。实现这个的最简单的方法就是在Vs的Server Explorer窗口中打开一个数据库,选择你想生成模型的数据表和视图,然后将它们通过拖放的方式放到LINQ to SQL设计器上:



当从"Northwind"数据库中向LINQ to 设计器面板上添加两个如上的如时,你会看到如下的基于你的数据结构的三个实体类:



通过上边定义的的数据模型,我现在就可以执行在本系列的第一部分(Part 1)中提及的所有事例代码(除了存储过程那个)。我不用添加任何的其他附加代码或者设置,直接就可以运行那些查询,插入,更新,删除和服务器端分页的代码。

命名及复数

有一件事你可能已经注意到了,当用LINQ to SQL设计器生成基于你的数据库结构的实体类时,它会自动地将表和列名变为“复数”。例如:在事例中的“Products"产生了一个"Product"类,"Categories"表产生了一个"Category"类。这些类命名方法使你的模型和.NET 的命名相一致,并且我经常发现让设计器为我完成命名非常地方便(尤其当向模型中添加许多的表时)。

如果你不喜欢设计器生成的类的名称或属性名称,你也可以重写它将它重命名为你想要的名字。你可以通过如下方式进行重命名:或者在设计器中的已声明的名字内部来修改或者通过属性列来修改:




这种将你数据库中结构中的实体/属性/关系的方法命名为不同的名的方法在许多情况下非常有用,特别是:

1)当原来的数据库中的表/列名变化时。因为你的实体模型根据后端的不同的名字,你可以用新的表/列名称,只更新你映射的规则而不更新你的应用程序或者查询代码。

2)当你的数据库模型的名字不是十分“清晰”时。例如,在开发时,你可以将名字命名为"LastName"和"FirstName",而不用为一个实体类的属性命名为“au_lnname"和"au_fname"(不用重命名数据库中的列名)。

关系组织

当你从Server Explorer中拖对象到LINQ to SQL设计器中时,VS将会检测对象的主/外键,并且通过它们在它生成的不同的实体类中生成“关系组织”。例如,当我从Northwind数据库中添加Product和Categories两个表到LINQ to SQL设计器时,你将看到在二者之后将生成一对多的关系(在设计器中通过箭头来表示)




上面的关系将会使得Product实体类有一个"Category"属性,开发者可以通过此属性来获取到属性此类别的所有产品集合。




如果你不喜欢设计器为你生成或者命名一个关系,你也可以重写它。只要单击设计器中的关系箭头,通过属性器找到它的属性来重命名,删除或修改它。

延迟/惰加载

LINQ to SQL可以让开发者指定在初次调用时就加载还是延迟/惰加载。你可通过在设计器中选择一个实体属性或方法,指定是预先加载还是延迟加载,然后在属性窗口中将“Delay Loaded"属性设置为true或false。

举个简单的例子,当我想做这些的时,来看一下我们刚才生成的"Category"实体类,Northwind中的categories表有一个"Picture"字段,该字段存储了一个每一个类别的图片(非常大),并且我只想在我用它的时候再从数据库中检索该二进制的图片字段(不是我在做一个列出所有列表的简单查询时就检索出来)

我可以通过在LINQ to SQL设计器中选择Picture属性,将它的Delay Loaded的值设置为true。





注意:除了在实体上设置默认的pre-fetch/delay加载之外,你也可以在对实体类写LINQ 查询时通过代码控制它。

使用存储过程

LINQ to SQL允许你选择地将存储过程作为你的DataContext类的一个方法。例如,假如我们已经定义了一个如下的存储过程,该存储过程通过categoryID来产品的信息:



为了添加一个强类型的方法来执行存储过程,我可以用在Vs中的server explorer来拖/放存储过程到LINQ to SQL设计器上。如果我将存储过程放到设计器中的"Product"上,LINQ to SQL设计器将会声明一个返回IEnumberable<Product>结果集的方法。



然后我可以或者使用LINQ的查询语法(它会生成adhoc SQL 查询)或者利用执行以上添加的存储过程方法来从数据库中产品实体:




使用存储过程来更新/删除/插入数据

默认情况下,在你插入/更新/删除实体时,LINQ to SQL将会自动的为你生成合适的SQL语句。例如,当你写了如下的更新"Product"实体对象的一些值的LINQ to SQL代码时:



默认情况下,当你提交更新时,LINQ to SQL将会生成并执行合适的"Update"语句声明。(我将会有下几篇帖子中来讲解“更新”这一部分)。你也选择定义自己的Insert,Update,Delete的存储过程。设置自定义的存储过程的话,在LINQ to SQL设计器的实体类上单击,在属性窗口中点击Delete/Insert/Update之后的“...”按钮,选择你已经定义好的存储过程来替换默认的:



更改以上设置的好处是,这在LINQ to SQL的映射层很完全地做完了,这意味着我前其展示的更新的代码将会在不更改的情况下继续正常使用。这避免了开发者在使用LINQ to SQL模型时,更改代码来优化程序,即便要添加一个自定义的存储过程。

总结

LINQ to SQL提供了一种优秀的,清晰的方法来为你的应用程序***数据层。一旦你定义了数据模型,你可以对它进行有效的查询,插入,更新和删除。

通过VS和Visual Web Developer Express内置的LINQ to SQL设计器,你可以快速地生成数据模型,尤其生成LINQ to SQL模型。LINQ to SQL设计器还提供了许多你能自定义的默认行为进行灵活扩展来满足你的特殊的需求。

在接下来的帖子中,我将会用上边生成的数据模型来进一步的进行演练查询,插入,更新和删除。在更新,插入和删除帖子中我将再次讨论如何向我们设计的实体中添加自定义的业务/数据验证逻辑。

Mike Taulty 还有许多好的Linq to SQL 视频,我已经在这里进行了推荐。这将为一个初学者提供一个非常方便的道路。

Scott
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: