快捷搜索:

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

应用DinnerRepository类实现检索、更新、插入和删除操作

现在我们已经创建了DinnerRepository类,下面我们看看一些示例代码。

查询代码:

下面的代码应用DinnerID检索一条Dinner记录:

DinnerRepository dinnerRepository = new DinnerRepository();

// Retrieve specific dinner by its DinnerID

Dinner dinner = dinnerRepository.GetDinner(5);

下面的代码用来检索所有将来的dinners,并遍历:

DinnerRepository dinnerRepository = new DinnerRepository();

// Retrieve all upcoming Dinners

var upcomingDinners = dinnerRepository.FindUpcomingDinners();

// Loop over each upcoming Dinner

foreach (Dinner dinner in upcomingDinners) {

}

插入和更新代码:

下面的代码演示新增2个dinners,新增或更新的信息不会提交到数据库,直到调用Save() 措施。LINQ to SQL自动包装所有更新的数据库事务,是以在调用Repository的Save() 措施时,或者所有的变化都发生,或者都不发生。

DinnerRepository dinnerRepository = new DinnerRepository();

// Create First Dinner

Dinner newDinner1 = new Dinner();

newDinner1.Title = "Dinner with Scott";

newDinner1.HostedBy = "ScotGu";

newDinner1.ContactPhone = "425-703-8072";

// Create Second Dinner

Dinner newDinner2 = new Dinner();

newDinner2.Title = "Dinner with Bill";

newDinner2.HostedBy = "BillG";

newDinner2.ContactPhone = "425-555-5151";

// Add Dinners to Repository

dinnerRepository.Add(newDinner1);

dinnerRepository.Add(newDinner2);

// Persist Changes

dinnerRepository.Save();

下面的代码首先检索一个存在的Dinner工具,然后更新2个属性,着末调用Repository工具的Save() 措施,提交更新到数据库。

DinnerRepository dinnerRepository = new DinnerRepository();

// Retrieve specific dinner by its DinnerID

Dinner dinner = dinnerRepository.GetDinner(5);

// Update Dinner properties

dinner.Title = "Update Title";

dinner.HostedBy = "New Owner";

// Persist changes

dinnerRepository.Save();

下面的示例代码首先检索一个dinner工具,然后添加一个RSVP工具。这里,应用Dinner工具的RSVPs聚拢工具。当调用Resposity工具的Save()措施时,一条新的记录添加RSVP表中。

DinnerRepository dinnerRepository = new DinnerRepository();

// Retrieve specific dinner by its DinnerID

Dinner dinner = dinnerRepository.GetDinner(5);

// Create a new RSVP object

RSVP myRSVP = new RSVP();

myRSVP.AttendeeName = "EntLib.com Team";

// Add RSVP to Dinner's RSVP Collection

dinner.RSVPs.Add(myRSVP);

// Persist changes

dinnerRepository.Save();

删除操作代码:

下面的代码首先检索一个已存在的Dinner工具,然后调用Repository工具的Delete() 措施,标记该笔记录删除。着末,在调用Repository工具的Save() 措施时,从数据库表中删除该记录。

DinnerRepository dinnerRepository = new DinnerRepository();

// Retrieve specific dinner by its DinnerID

Dinner dinner = dinnerRepository.GetDinner(5);

// Mark dinner to be deleted

dinnerRepository.Delete(dinner);

// Persist changes

dinnerRepository.Save();

点击Add按钮,添加Dinner.cs文件到项目中,并默认打开。接着,我们应用如下的代码来实现基础的营业规则/验证机制。

public partial class Dinner

{

public bool IsValid

{

get { return (GetRuleViolations().Count() == 0); }

}

public IEnumerable GetRuleViolations()

{

yield break;

}

partial void OnValidate(ChangeAction action)

{

if (!IsValid)

throw new ApplicationException("Rule violations prevent saving");

}

}

public class RuleViolation

{

public string ErrorMessage { get; private set; }

public string PropertyName { get; private set; }

public RuleViolation(string errorMessage)

{

ErrorMessage = errorMessage;

}

public RuleViolation(string errorMessage, string propertyName)

{

ErrorMessage = errorMessage;

PropertyName = propertyName;

}

}

这里,我们应用C#的yield return 特点,返回有序的RuleViolation聚拢。

**

yield return语句返回聚拢的一个元素,并移动到下一个元素上。yield break可竣事迭代。包孕yield语句的措施或属性也称为迭代块。迭代块必须声明为返回IEnumerator或IEnumerable接口。这个块可以包孕多个yield return语句或yield break语句,但不能包孕return语句。

**

前6个反省确保Dinner的字符串属性不能是null或空,着末一个规则对照有趣,调用PhoneValidator.IsValidNumber() 措施,该措施将添加项目,用来验证ContactPhone数字款式相符响应的规则。

我们应用.NET的正则表达式来实现电话号码的验证,下面是我们添加到项目中的一个简单PhoneValidator的实现,实现指定国家的正则模式反省。

public class PhoneValidator

{

static IDictionary countryRegex =

new Dictionary() {

{ "USA", new Regex("^[2-9]\d{2}-\d{3}-\d{4}$")},

{ "UK", new Regex("(^1300\d{6}$)|(^1800|1900|1902\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\d{4}$)|(^04\d{2,3}\d{6}$)")},

{ "Netherlands", new Regex("(^\+[0-9]{2}|^\+[0-9]{2}\(0\)|^\(\+[0-9]{2}\)\(0\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\-\s]{10}$)")},

};

public static bool IsValidNumber(string phoneNumber, string country)

{

if (country != null && countryRegex.ContainsKey(country))

return countryRegex[country].IsMatch(phoneNumber);

else

return false;

}

public static IEnumerable Countries

{

get

{

return countryRegex.Keys;

}

}

}

现在,当我们创建或更新Dinner工具时,验证逻辑规则将生效。开拓职员可以主动判断是否Dinner工具是有效,并在不抛出非常的环境下,检索所有冲突列表。

Dinner dinner = dinnerRepository.GetDinner(5);

dinner.Country = "USA";

dinner.ContactPhone = "425-555-BOGUS";

if (!dinner.IsValid) {

var errors = dinner.GetRuleViolations();

// do something to fix errors

}

假如我们试图保存一个无效状态的Dinner工具,在调用DinnerRepository的Save() 措施时,将孕育发生非常。这是由于Dinner工具存在冲突的营业规则,Dinner.OnValidate() 分部措施(Partial Method)抛出非常。我们可以捕获这一非常,并主动检索冲突列表,进行修复。

Dinner dinner = dinnerRepository.GetDinner(5);

try {

dinner.Country = "USA";

dinner.ContactPhone = "425-555-BOGUS";

dinnerRepository.Save();

}

catch {

var errors = dinner.GetRuleViolations();

// do something to fix errors

}

由于验证和营业规则在营业领域模型层实现,而不是在用户界面UI层,这些可以利用在利用法度榜样的所有场景中。随后,我们可以变动或增添营业规则,并让这些代码利用到Dinner工具上。我们只必要在一个地方机动变动营业规则,而不必要在全部利用法度榜样和用户界面层到处变动,这是一个优越的利用法度榜样设计。

您可能还会对下面的文章感兴趣: