2011-09-05 44 views
1

我正在学习ASP.NET MVC,并且对于如何确保表格的列(用户名&电子邮件)的唯一值感到困惑。如何确保代码中的唯一列值?

任何人都可以帮助我一个示例代码或教程链接显示&解释这一点?

编辑:

我知道我可以在我的表列应用的唯一键约束,并实现它。但是,我想知道如何通过ASP.NET MVC代码实现它?

UPDATE:

我希望做一个检查我的应用程序,使得没有重复的值传递给DAL,即实现插入新行前的检查。

+0

你问关系到一个数据库,而不是ASP.NET MVC – brodie

+0

的问题@ brodie:不过,我想通过ASP.NET MVC了解它,所以更新了 – mliya

+0

@mliya这个问题,你有没有想出解决这个问题的方法呢? –

回答

0

Mliya,这是你在数据库级别控制的东西,而不是在应用程序级别。

如果你正在设计一个users表中,你想约束的usernameemail列是数据库UNIQUE你应该建立在这样的列的唯一索引。如果不知道你的后端数据库(mySQL,SQL Server,MS Access,Oracle ...),那么你不需要向你展示图片或告诉更多的事情,只需在设计器中创建表格,并将这些独特的约束添加到这些表格中列和设计,你会确保没有重复的值将永远不会插入用户名和电子邮件。

我也建议你创建一个ID列,它将被设置为PK(主键,这意味着它将自动设置为NON NULL和UNIQUE)。

从您的ASP.NET MVC应用程序,您当然应该确保没有重复的值然后传递到DAL用户名和电子邮件。你可以用不同的方式做到这一点,如果任何用户已经存在该用户名和/或电子邮件,最简单的可能是在插入新行之前进行检查,如果是这样,你可以显示通知消息告诉用户请选择另一对值。

+0

是的,这就是我想要做的,在我的应用程序中检查没有重复值传递给DAL,即在插入新行之前实现检查。在这方面你能帮助我吗?提前致谢! – mliya

+0

向我们展示了您现在如何进行插入操作,并让我们看看如何添加支票;-) –

+0

您可以推荐一些通用示例代码来演示此类功能吗? – mliya

0

在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; 
     } 
    } 
} 
+0

谢谢你的回答。但是,由于我正在学习asp.net mvc,因此我不太确定这个答案是否真的是基础知识,还是包含(某些)高级功能。您能否对此评论 – mliya

+0

我的答案是尝试教一个n层ASP.NET MVC应用程序的“最佳实践”实现。如果你想构建非常大规模的应用程序,那么这是非常重要的,但是一旦你完成了IoC的所有工作,并且没有比更基本的实现更困难。如果你想让你的应用程序增长,这是做到这一点的方法。 –

+2

除非我误解了这个解决方案是在保存之前对数据库执行测试,并且从理论上讲2个用户在同一时间输入数据仍然是可能的,两者都通过IsUnique测试,但是之后会失败数据库唯一约束。我想一个尝试/抓住周围的保存将数据库错误转换为用户错误将处理? –