我正在学习ASP.NET MVC,并且对于如何确保表格的列(用户名&电子邮件)的唯一值感到困惑。如何确保代码中的唯一列值?
任何人都可以帮助我一个示例代码或教程链接显示&解释这一点?
编辑:
我知道我可以在我的表列应用的唯一键约束,并实现它。但是,我想知道如何通过ASP.NET MVC代码实现它?
UPDATE:
我希望做一个检查我的应用程序,使得没有重复的值传递给DAL,即实现插入新行前的检查。
我正在学习ASP.NET MVC,并且对于如何确保表格的列(用户名&电子邮件)的唯一值感到困惑。如何确保代码中的唯一列值?
任何人都可以帮助我一个示例代码或教程链接显示&解释这一点?
编辑:
我知道我可以在我的表列应用的唯一键约束,并实现它。但是,我想知道如何通过ASP.NET MVC代码实现它?
UPDATE:
我希望做一个检查我的应用程序,使得没有重复的值传递给DAL,即实现插入新行前的检查。
Mliya,这是你在数据库级别控制的东西,而不是在应用程序级别。
如果你正在设计一个users
表中,你想约束的username
和email
列是数据库UNIQUE
你应该建立在这样的列的唯一索引。如果不知道你的后端数据库(mySQL,SQL Server,MS Access,Oracle ...),那么你不需要向你展示图片或告诉更多的事情,只需在设计器中创建表格,并将这些独特的约束添加到这些表格中列和设计,你会确保没有重复的值将永远不会插入用户名和电子邮件。
我也建议你创建一个ID列,它将被设置为PK(主键,这意味着它将自动设置为NON NULL和UNIQUE)。
从您的ASP.NET MVC应用程序,您当然应该确保没有重复的值然后传递到DAL用户名和电子邮件。你可以用不同的方式做到这一点,如果任何用户已经存在该用户名和/或电子邮件,最简单的可能是在插入新行之前进行检查,如果是这样,你可以显示通知消息告诉用户请选择另一对值。
在ASP.NET MVC体系结构中,您应该尝试在模型中执行大多数验证,但是使用像这样的低级别验证规则,有时是不可能的。你应该寻找答案然后是域驱动设计(DDD),其中Application Services可以解决这样的低级需求。
应用服务将有机会获得数据库(直接,或者更好;间接通过repositories),并可以执行低级别的验证,并抛出ValidationException
或类似的东西(有详细的信息Controller
可以进行操作,并在回应用户)当不满足先决条件或业务规则时。
S#arp Architecture在您可以用作ASP.NET MVC应用程序的基础的最佳实践框架中实现所有这些。它对DDD的原则和NHibernate非常有见地,它有时会强迫你如何做东西,这很重要。关于它最重要的部分是它学会了如何处理这些问题。
为了更具体,在DDD的精神回答你的问题,这是我会怎么解决这个问题:
public class UserController
{
private readonly IUserService userService;
public UserController(IUserService userService)
{
// The IUserService will be injected into the controller with
// an "Inversion of Control" container like NInject, Castle Windsor
// or StructureMap:
this.userService = userService;
}
public ActionResult Save(UserFormModel userFormModel)
{
if (userFormModel.IsValid)
{
try
{
// Mapping can be performed by AutoMapper or some similar library
UserDto userDto = Mapper.Map<UserDto>(userFormModel);
this.userService.Save(userDto);
}
catch (ValidationException ve)
{
ViewBag.Error = ve.Detail;
}
}
// Show validation errors or redirect to a "user saved" page.
}
}
public class UserService : IUserService
{
private readonly IUserRepository userRepository;
public UserService(IUserRepository userRepository)
{
// The IUserRepository will be injected into the service with
// an "Inversion of Control" container like NInject, Castle Windsor
// or StructureMap:
this.userRepository = userReposityr;
}
public UserDto Save(UserDto userDto)
{
using (this.userRepository.BeginTransaction())
{
if (!this.userRepository.IsUnique(userDto.UserName))
{
// The UserNameNotUniqueValidationException will inherit from ValidationException
// and build a Detail object that contains information that can be presented to
// a user.
throw new UserNameNotUniqueValidationException(userDto.UserName);
}
userDto = this.userRepository.Save(userDto);
this.userRepository.CommitTransaction();
return userDto;
}
}
}
谢谢你的回答。但是,由于我正在学习asp.net mvc,因此我不太确定这个答案是否真的是基础知识,还是包含(某些)高级功能。您能否对此评论 – mliya
我的答案是尝试教一个n层ASP.NET MVC应用程序的“最佳实践”实现。如果你想构建非常大规模的应用程序,那么这是非常重要的,但是一旦你完成了IoC的所有工作,并且没有比更基本的实现更困难。如果你想让你的应用程序增长,这是做到这一点的方法。 –
除非我误解了这个解决方案是在保存之前对数据库执行测试,并且从理论上讲2个用户在同一时间输入数据仍然是可能的,两者都通过IsUnique测试,但是之后会失败数据库唯一约束。我想一个尝试/抓住周围的保存将数据库错误转换为用户错误将处理? –
你问关系到一个数据库,而不是ASP.NET MVC – brodie
的问题@ brodie:不过,我想通过ASP.NET MVC了解它,所以更新了 – mliya
@mliya这个问题,你有没有想出解决这个问题的方法呢? –