一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4


一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4
 
本文根据《Professional ASP.NET MVC 1.0》中微软牛人Scott Guthrie 提供免费下载的第一章,一步一步演示如何通过ASP.NET MVC 1.0 正式版创建NerdDinner 范例程序。对了解如何使用最新的ASP.NET MVC 1.0框架创建Web Application 非常有帮助。本文由http://forum.entlib.com 开源论坛小组提供。关于本文的一些资源,请参考文章最后的链接。
 
前面系列文章:
 
本文继续学习之旅,一步一步通过ASP.NET MVC 1.0 实现NerdDinner 范例程序。
 
创建Model模型
在Model-View-Controller 框架中,model表示应用程序的数据对象,以及相应的业务领域逻辑,包括数据验证和业务规则。model是MVC应用程序的核心部分,下面我们会看到model的作用。
ASP.NET MVC框架支持使用任意数据访问技术,开发人员可以选择大量的.NET 数据访问技术实现model,如LINQ to Entities、LINQ to SQL、NHibernate、LLBLGen Pro、SubSonic、WilsonORM、或者基本的ADO.NET DataReaders、DataSets等等。
对于本范例程序NerdDinner,我们将采用LINQ to SQL创建一个简单的业务领域模型,非常接近于数据库的设计,并增加了一些定制的验证逻辑和业务规则。接下来实现一个repository类,帮助抽象化数据实体的实现,允许我们轻松实现单元测试。
 
LINQ to SQL
LINQ to SQL是.NET 3.5的ORM(Object Relational Mapper)部分。LINQ to SQL提供了一个简单的方式映射数据表到.NET 类。对于我们的NerdDinner范例程序,我们将映射Dinners和RSVP数据表到Dinner和RSVP模型类。Dinners和RSVP数据表中的列将映射为Dinner和RSVP模型类的属性。每一个Dinner和RSVP对象将表示Dinners或RSVP数据表中的一条单独的数据记录。
LINQ to SQL避免让我们手动创建SQL脚本从数据库中检索和更新Dinner和RSVP对象。在访问或更新数据库记录时,LINQ to SQL将负责生成合适的SQL执行逻辑。我们可以使用VB和C#支持的LINQ语言写查询表达式,检索Dinner和RSVP对象。这样可以大量减少代码行,构建清晰的应用程序。
 
增加LINQ to SQL类到项目程序中
现在终于可以回到我们的NerdDinner应用程序了!右键点击Models文件夹,选择Add -> New Item 菜单项。
 

 
在弹出的Add New Item对话框,如下图所示。选择LINQ to SQL Classes模板,命名为NerdDinner.dbml,然后点击Add 按钮。Visual Studio 将添加NerdDinner.dbml 文件到\Models目录,并自动打开LINQ to SQL对象关系设计器。
 
 
使用LINQ to SQL 创建Data Model Classes
LINQ to SQL允许我们从现有的数据库快速数据模型类。我们可以在Server Explorer窗口打开NerdDinner数据库,并选择需要建模的数据表。将表Dinners和RSVP表拖拉到NerdDinner.dbml设计器中,如下图所示。
 

 
默认情况下,LINQ to SQL设计器在基于数据表创建类时,自动复数化表和列名。例如,范例中的Dinners表自动产生Dinner类。这一类的命名有助于我们的模型类符合.NET命名规范。但是,如果你不喜欢设计器自动生成的类或属性名,你可以在设计器中编辑或者通过属性列表进行更新。
另外,默认情况下,LINQ to SQL设计器也会自动监视主键/外键关系,并基于这些关系,创建不同模型类之间的关联关系。如上图所示,当我们拖拉Dinners 和 RSVP表到LINQ to SQL设计器上时,自动创建1对多的关联关系,图中通过一个箭头进行表示。
上述关联关系将让LINQ to SQL增加一个强类型的Dinner属性到RSVP类中,开发人员可以使用指定RSVP的Dinner属性访问关联的实体。也会让Dinner类有一个强类型的RSVP集合属性,允许开发人员检索和更新Dinner关联的RSVP对象集合。
 
下面,我们看看当创建RSVP对象,并增加到Dinner’s RSVP集合是,Visual Studio 的智能提示:
 
 
从上可以看到LINQ to SQL如何为Dinner对象创建RSVPs 集合,我们使用这个关联数据表Dinner和RSVP之间的一个外键关系。
 

 
如果你不喜欢设计器的建模或命名的关联关系,你可以更改。点击设计器中的关联箭头,访问属性窗口,可以进行重命名、删除或者更改。对于NerdDinner应用程序,我们将使用默认的设置。
 
 
今天就到这里了,明天继续翻译ASP.NET MVC eBook – 开发NerdDinner 范例程序向导。欢迎访问http://blog.EntLib.com 博客平台获取更多的MVC学习资料。
 
相关资源下载链接:
1. ASP.NET MVC 1.0 正式版发布了!!!
 
2. 免费ASP.NET MVC eBook 向导-电子书下载
 

 

发表 @ 2009年3月28日 16:40

打 印

评论

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by sheep at 2009/3/30 11:20
Gravatar
我从数据库把表拖到NerdDinner.dbml设计器中,为什么表名没有自动去掉复数?
Dinners还是Dinners

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by entibforum at 2009/3/30 11:51
Gravatar
怎么会这样?默认情况下,是会自动去掉复数的。我没有碰到过这样的问题。

不过,你还是可以手动的去掉复数。

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by sheep at 2009/3/30 12:08
Gravatar
我这边的确是这样。。实体类还是Dinners。如果在设计器里改为Dinner。则在NerdDinnerDataContext里面的属性Dinners也被改为Dinner。
我的VS2008是专业版的,sql server2005 是企业版的。不知道会不会跟这个有关系。
之前都没有注意到这个,今天mvc英文版时才注意到,就在网上搜,就搜到你这来了。
你翻译得真快^_^

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by entlibforum at 2009/3/30 16:42
Gravatar
Sheep,

我使用的是VS 2008 Team System,数据库是 SQL Server 2005 / 2008,都没有遇到这个问题。

如果在设计器里改为Dinner。则在NerdDinnerDataContext里面的属性Dinners也被改为Dinner。 --- 这个是正确的,就应该这样。

欢迎交流! ^_^

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by tom at 2009/3/31 14:51
Gravatar
工具-》选项-》数据库工具-》or设计(好像只有简体中文才有这个问题,英文的没有)

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by entlibforum at 2009/3/31 15:34
Gravatar
哦~ 我使用的是英文版的 Visual Studio 2008 Team System,没有这个问题。谢谢tom 的反馈。

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by bear9927 at 2009/4/21 11:51
Gravatar
我跟sheep狀況一模一樣

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by 111 at 2009/5/5 13:01
Gravatar
你好啊,请问能帮我解释一下这句的意义吗?
diner diner=db.diner.single(d>=d.dinerid==1)
d>=d.dinerid==1是什么意思啊?

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by entlibforum at 2009/5/5 14:14
Gravatar
这是标准的Lambda 表达式:
所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。Lambda 表达式 x => x * x 读作“x goes to x times x”。

d=>d.dinerid==1,表示查找d.dinnerid==1 的对象。

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by 小米 at 2009/5/11 22:19
Gravatar
我也一样做了好几次,都没有见自动生成Dinner.cs
奇怪了,什么原因呢?

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by Nick at 2009/5/21 20:43
Gravatar
英文版VS2008的没问题

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by craftsman at 2009/6/1 11:14
Gravatar
楼主,我感觉Dinners表拖到DBML里,那个名字应该是Dinners才对,否则db的dinners集合从何而来?照你的教程,我这里打db.智能提示只有db.dinner。

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by entlibforum at 2009/6/1 20:31
Gravatar
Dinner 是实体对象的名称,Dinners是集合对象的名称。你看看NerdDinner.Desginer.cs 文件就知道了:

public System.Data.Linq.Table<Dinner> Dinners
{
get
{
return this.GetTable<Dinner>();
}
}

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by craftsman at 2009/6/2 2:02
Gravatar
谢谢楼主的热心,这么多人不厌其烦的问,都有耐心一个一个回答,谢谢!
-----------------------------------------------------------------------------------------
Dinner 是实体对象的名称,Dinners是集合对象的名称。你看看NerdDinner.Desginer.cs 文件就知道了:

public System.Data.Linq.Table<Dinner> Dinners
{
get
{
return this.GetTable<Dinner>();
}
}
------------------------------------------------------------
我现在明白什么原因了,因为将dinners和rsvp表拖放到dbml里后,然后将dinners类名改成dinner的时候会修改NerdDinner.Desginer.cs这个文件。

public System.Data.Linq.Table<Dinner> Dinners
会变成
public System.Data.Linq.Table<Dinner> Dinner

所以在dbml里修改后,要手动修改下这句话,在后面加一个“s”,rsvp也同样道理。

另外我有一点不明白的,就是说表dinners拖放到dbml的时候类名会自动变成dinner,那很多英文单词的复数都是不规则的,况且类名也可以自定义的,假设我表名取”abc“,那把abc这个表拖放到dbml里,vs又会怎么处理呢?

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by entlibforum at 2009/6/2 13:14
Gravatar
VS 只是自动去除复数 s,但是你也可以在DBML设计器中,手动修改实体对象的名称。

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by wys at 2009/7/2 9:53
Gravatar
我想问下,当我把这两个表拖到设计器中后,就生成了NerdDinner.dbml,它下面有三个文件NerdDinner.cs,NerdDinner.dbml.layout,NerdDinner.desiginer.cs.上面写的
Dinner dinner=db.Dinners.Single( d => d.DinnerID==1);...这些代码都是在哪个文件里面写的啊,为什么我db打点后面没有提示啊,是不是需要引用啊。

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by wys at 2009/7/2 10:02
Gravatar
看了后面的一节我知道了。db是NerdDinnerDataContext的对象。

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by wys at 2009/7/2 10:46
Gravatar
还问一个问题。
Dinner dinner=new Dinner();
dinner.RSVP;为什么我这里dinner点出来的是RSVP,你那里是RSVPs,你不是说关联关系可以更改,在这里保留默认设置吗,我这里的默认设置为什么RSVP后面没有s了。

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by jackw at 2009/7/13 16:04
Gravatar
看了你的文章,很不错,也正在学习MVC,但是,我实际操作了一下,有以下问题:
1.用Linq to SQl 的时候,没有自动生成dinner.cs类;
2.出现复数问题;和sheep的问题一样。
3.出现 RSVPs.Any 那里有问题,提示什么没有那个……

开发环境是:vs2008 sp1 team + sql 2005 sp2

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by yjl49 at 2009/7/24 17:24
Gravatar
在把两个表拖入视图编辑器之后要
1.将dinners表名改为dinner
2.将表关系在属性中设置为one to many
3.去NerdDinner.disigner.cs中修改代码
-------------------------------------------
最好下载源码对比着改下就OK了

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by 求助: at 2009/7/27 9:09
Gravatar
有没人能告诉我Dinner为什么出不来?QQ:1149369725

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by 求助: at 2009/7/27 9:10
Gravatar
有没人能告诉我Dinner智能提示为什么出不来?(前面全部照做,就是写代码的时候出不来)QQ:1149369725

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by rt at 2009/12/4 13:38
Gravatar
这些代码都是在哪个文件里面写的啊

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by 1001tao.com at 2010/2/21 16:50
Gravatar
about:
我从数据库把表拖到NerdDinner.dbml设计器中,为什么表名没有自动去掉复数?
Dinners还是Dinners
Answer:VS 2008 版本设置问题,参照以下官方资料

如何打开和关闭复数形式(O/R 设计器)
msdn.microsoft.com/zh-cn/library/bb384507.aspx

再删除,重新创建就可以了~

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by cdelphi at 2010/3/11 16:36
Gravatar
return RSVPs.Any(r => r.AttendeeName.Equals(userName,
StringComparison.InvariantCultureIgnoreCase));

这个为什么通不过,

# re: 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

Left by dongzi at 2010/3/17 13:59
Gravatar
这些代码都是在哪个文件里面写的啊

您的评论:



 (不显示)


 
 
 
Please add 3 and 4 and type the answer here:
    
 

评论预览窗口:

 
«九月»
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789