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


一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 5
 
本文根据《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 范例程序。
 
NerdDinnerDataContext
Visual Studio 自动生成.NET类,表示LINQ to SQL设计器创建的模型和数据库关系,同时也会每一个LINQ to SQL设计器文件生成LINQ to SQL DataContext 类。因为,我们命名LINQ to SQL类为NerdDinner,创建的DataContext类将命名为NerdDinnerDataContext,NerdDinnerDataContext类将是我们与数据库交互的基本方式。
NerdDinnerDataContext类公开了2个属性- Dinners和RSVPs,分别表示建模的2个数据表。我们使用C#写LINQ查询语句访问这些属性,从数据库去查询和检索Dinner 和RSVP对象。如下的代码演示如何实例化NerdDinnerDataContext 对象,并执行LINQ 查询,获取系列Dinners对象。
 

 
NerdDinnerDataContext对象跟踪对Dinner和RSVP对象的所有变更,允许我们轻松保存变更到数据库中。下面的代码演示如何使用LINQ查询从数据库中检索一个单一的Dinner对象,更新其中2个属性,接着保存变更到数据库。
 
 
代码中的NerdDinnerDataContext对象自动跟踪对Dinner对象的所有属性变更。当我们调用SubmitChanges() 方法时,它对数据库执行合适的SQL Update语句,将新的数据更新到数据库。
 
创建DinnerRepository
对于一个小应用程序而言,有时让Conrollers类直接使用LINQ to SQL DataContext类,并将LINQ 查询语句写在Controllers中。但随着应用程序越来越大,这一方法的维护和测试将变得麻烦,并且导致重复的LINQ查询在多个地方出现。
 
让维护和测试更方便的方法是使用Repository 模式。Repository类帮助封装数据查询和存储逻辑,从应用程序中抽象隔离具体的数据存储实现。除了是应用程序代码更加简洁外,使用Repository模式使将来更改数据库存储实现更加方便,并且有助于在没有真实数据库的情况下,进行应用程序进行单元测试。
 
对NerdDinner应用程序,我们将定义一个DinnerRepository类,类的原型如下:
 
 
备注:在本章后面部分,我们将从这个类中提取IDinnerRepository 接口,允许在Controllers类实现依赖注入(Dependency Injection)。但在开始的时候,我们将开始一个简单的、直接工作的 DinnerRepository类。
为了实现这个类,右键点击Models文件夹,选择Add -> New Item菜单项。在Add New Item对话框,我们选择Class 模板,并命名文件为DinnerRepository.cs。呵呵,终于又回到NerdDinner应用程序了。
 

 
接下来,我们实现DinnerRepository 类,示例代码如下:
    public class DinnerRepository
    {
        private NerdDinnerDataContext db = new NerdDinnerDataContext();
        //
        // Query Methods
        public IQueryable<Dinner> FindAllDinners()
        {
            return db.Dinners;
        }
        public IQueryable<Dinner> FindUpcomingDinners()
        {
            return from dinner in db.Dinners
                   where dinner.EventDate > DateTime.Now
                   orderby dinner.EventDate
                   select dinner;
        }
        public Dinner GetDinner(int id)
        {
            return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
        }
        //
        // Insert/Delete Methods
        public void Add(Dinner dinner)
        {
            db.Dinners.InsertOnSubmit(dinner);
        }
        public void Delete(Dinner dinner)
        {
            db.RSVPs.DeleteAllOnSubmit(dinner.RSVPs);
            db.Dinners.DeleteOnSubmit(dinner);
        }
        //
        // Persistence
        public void Save()
        {
            db.SubmitChanges();
        }
    }
 
 
今天就到这里了,明天继续翻译ASP.NET MVC eBook – 开发NerdDinner 范例程序向导。欢迎访问http://blog.EntLib.com 博客平台获取更多的MVC学习资料。
 
相关资源下载链接:
1. ASP.NET MVC 1.0 正式版发布了!!!
 
2. 免费ASP.NET MVC eBook 向导-电子书下载
 

 

发表 @ 2009年3月28日 18:31

打 印

评论

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

Left by 尹庆文 at 2009/4/8 17:33
Gravatar
这章的内容好像有些问题,db.RSVPs.DeleteAllOnSubmit(dinner.RSVPs);编译不过,提示:错误 1 无法从用法中推导出方法“System.Data.Linq.Table.DeleteAllOnSubmit(System.Collections.Generic.IEnumerable)”的类型实参。请尝试显式指定类型实参。 G:\Yin-code\NerdDinner\NerdDinner\Models\DinnerRepository.cs 36 13 NerdDinner

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

Left by entlibforum at 2009/4/8 19:46
Gravatar
尹庆文,

我们对所有代码都进行了测试,每一步都操作过和测试过,不仅仅是翻译哦。

是不是你忘记建立了2个表之间的外键关联?具体操作步骤在:
一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 3
一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序,Part 4

如果问题还不能解决,建议你提供更详细的错误信息。

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

Left by gameover at 2009/4/9 11:23
Gravatar
我也不能运行哦..
在Dinner.cs这个文件中的错误:
错误 1 找不到类型或命名空间名称“ChangeAction”(是否缺少 using 指令或程序集引用?) D:\My Documents\Visual Studio 2008\Projects\MvcApp\MvcApp\Models\Dinner.cs 20 33 MvcApp
都不晓得为什么..应该没的错的...
..这些代码你们都实际运行过吗?
幸苦你们了哈

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

Left by entlibforum at 2009/4/9 13:04
Gravatar
gameover,

这些代码我们都有实际的运行过。你看看是不是你忘记引用一些命名空间了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using NerdDinner.Models;

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

Left by gameover at 2009/4/9 17:50
Gravatar
引用了也不可以...
就是Dinner.cs
里面..
这个
partial void OnValidate(ChangeAction action)
{
if (!IsValid)
throw new ApplicationException("Rule violations prevent saving");
}
唉..郁闷死了.
..还是谢谢咯哈

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

Left by entlibforum at 2009/4/9 19:10
Gravatar
我以为是 DinnersController.cs 有异常呢。。。

在Dinner.cs 文件头部,引用下面这个namespace就可以了:
using System.Data.Linq;

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

Left by entlibforum at 2009/4/9 19:11
Gravatar
记得还要引用正则表达式的namespace:

using System.Text.RegularExpressions;

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

Left by gameover at 2009/4/9 23:21
Gravatar
呵呵.谢谢了..
...觉得你们可以把这样的问题在后面补充下.
.免得我们这样的菜鸟犯迷糊哈.
..幸苦了..
...谢谢..
3Q..

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

Left by ZilchWei at 2009/4/10 22:56
Gravatar
能否提供视频语言教程,patr5和6都在报错

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

Left by ZilchWei at 2009/4/10 22:58
Gravatar
错误 1 “NerdDinner.Models.NerdDinnerDataContext”不包含“Dinners”的定义,并且找不到可接受类型为“NerdDinner.Models.NerdDinnerDataContext”的第一个参数的扩展方法“Dinners”(是否缺少 using 指令或程序集引用?)\Projects\NerdDinner\NerdDinner\Models\DinnerRepository.cs 17 23 NerdDinner

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

Left by entlibforum at 2009/4/10 23:24
Gravatar
ZilchWei,

可能是你在某一步操作错误了。
你可以下载NerdDinner的范例程序源代码对比一下:
http://forum.entlib.com/Default.aspx?g=posts&t=487

上述下载的NerdDinner范例程序,包括数据库文件(SQL Server 2008)。

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

Left by itbird at 2009/4/13 12:14
Gravatar
添加一个新类,默认的引用你和源码里面的 引用不一样??为何教程没有说明这个情况?
默认引用如下:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
你在实际操作的时候,添加的类,默认引用难道不一样,我使用的是简体中文版.
我发觉有不少错误出于此....

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

Left by entlibforum at 2009/4/13 16:01
Gravatar
我们使用的是visual studio 2008 team suite 英文版,没有实际比较过默认的namespace的引用在不同的VS 版本中是否存在不一致的情况。

不过,在VS 2008 中添加namespace的引用很方便,IDE的提示也很明确。

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

Left by xino at 2009/4/15 15:54
Gravatar
错误 1 未找到用于实现分部方法“NerdDinner.Models.Dinner.OnValidate(System.Data.Linq.ChangeAction)”的声明的定义声明 F:\ASP.NET MVC\sources\NerdDinner\NerdDinner\Models\Dinner.cs 46 22 NerdDinner
都不知道是啥原因,下载你们的源码运行没出现这种情况,但是把dbml删掉后,用sql2000重新创建后,出现一样的问题。

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

Left by entlibforum at 2009/4/15 16:08
Gravatar
你检查一下 \Models\Dinner.cs 类中有下面这个方法么?
partial void OnValidate(ChangeAction action)

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

Left by xino at 2009/4/15 16:29
Gravatar
有的。就是这个方法报错。

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

Left by entlibforum at 2009/4/15 21:09
Gravatar
xino,

Dinner.cs 是一个Partial 类。
问题估计是 Dinner.cs 没有找到DBML中的:
[Table(Name="dbo.Dinners")]
public partial class Dinner : INotifyPropertyChanging, INotifyPropertyChanged

需要确认你定义的Dinner.cs Partial类和 DBML中的Dinner 类在同一个namespace,或者引用DBML的namespace。我们提供的示例代码中,DBML的namespace 为NerdDinner.Models


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

Left by .net的mvc at 2009/5/15 12:50
Gravatar
写的不是很细致的,按文章来做,很多地方调试不成功。可能是作者省去了一些环节,只说主要的部分,但这样会让跟着你做的读者,无所适从的。。。

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

Left by .net的mvc at 2009/5/15 12:52
Gravatar
如果,NerdDinnerDataContext 类,从哪来的,系统自动生成的,还是自己建的?放在哪了?一直没找到。文章类似这样的问题,很多。翻译的实在是不怎么太好。。。

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

Left by .net的mvc at 2009/5/15 12:57
Gravatar
Error 1 The type or namespace name 'NerdDinnerDataContext' could not be found (are you missing a using directive or an assembly reference?) E:\mvc\NerdDinner\NerdDinner\Models\DinnerRepository.cs 8 13 NerdDinner
一直提示找不到'NerdDinnerDataContext' ,不知怎么回事

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

Left by entlibforum at 2009/5/15 17:43
Gravatar
NerdDinnerDataContext class 是dbml 设计器自动创建的一个类,文件名NerdDinner.dbml。

这里有NerdDinner 范例程序的完整代码的下载:
forum.entlib.com/Default.aspx?g=posts&t=496

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

Left by kane at 2009/6/22 3:05
Gravatar
补充说明
该死的枚举

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

Left by wys at 2009/7/2 11:07
Gravatar
请问下。dinners这个s在设计中不是自动去掉了吗,但这里为什么db.Dinners和db.RSVPS.这里db点出来的是一个对象还是一个集合啊。

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

Left by entlib at 2009/7/4 8:22
Gravatar
wys, db.Dinners和db.RSVPs 分别是Dinner、RSVP 实体对象集合类型。

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

Left by a at 2009/7/17 23:51
Gravatar
eee

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

Left by feifeiyaqi3 at 2009/7/17 23:53
Gravatar
dinner.cs

这个是编写类吧,不是自动生成的吗

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

Left by grand at 2009/9/18 9:11
Gravatar
出现上述问题的原因,是因为创建DerdDinner.dbml即LINQ TO SQL类的时候,他自动生成的名称是复数形式的(dinner变成了dinners),与书上的例子不同。不知为何原因。

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

Left by daniel at 2009/12/11 14:24
Gravatar
我的NerdDinner.design.cs生成的内容和在你们网站下载的完全不同,为什么啊,是asp.net mvc版本问题么??

根本没有InsertDinner和DeletDinner等方法

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

Left by eaglet at 2009/12/19 16:43
Gravatar
db.RSVPs.DeleteAllOnSubmit(dinner.RSVP);

这句错误

The type arguments for method 'System.Data.Linq.Table<NerdDinner.Models.RSVP>.DeleteAllOnSubmit<TSubEntity>(System.Collections.Generic.IEnumerable<TSubEntity>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

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

Left by nnn at 2009/12/25 14:14
Gravatar
错误 1 无法从用法中推导出方法“System.Data.Linq.Table<NerdDinner.Models.RSVP>.DeleteAllOnSubmit<TSubEntity>(System.Collections.Generic.IEnumerable<TSubEntity>)”的类型实参。请尝试显式指定类型实参。 C:\Users\Administrator\Documents\Visual Studio 2008\Projects\NerdDinner\NerdDinner\Models\DinnerRepository.cs 36 13 NerdDinner

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

Left by shijiesj at 2010/4/15 23:16
Gravatar
db.RSVPs.DeleteAllOnSubmit(dinner.RSVP);

这句错误
我也碰到了同样的错误
示例中表名是 dinners是带复数的 把它重新改名为dinner
然后重新建立NerdDinnerDataContext 就OK了

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

Left by ChangeAction 方法错误解决 at 2010/4/26 16:12
Gravatar
缺少引用using System.Data.Linq;

您的评论:



 (不显示)


 
 
 
Please add 1 and 1 and type the answer here:
    
 

评论预览窗口:

 
«九月»
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789