C# 具有ASP.NET标识的模型的唯一属性

C# 具有ASP.NET标识的模型的唯一属性,c#,asp.net,asp.net-mvc,asp.net-web-api,asp.net-identity,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Asp.net Identity,我正在使用visual studio 2013开发一个WEB API asp.net项目,并正在实现用于自定义注册的自定义标识模型。例如,我在RegisterBindingModel中添加了一个电子邮件字段 这就是我所做的: 我添加了电子邮件属性,我需要该属性是唯一的(作为用户名),但默认情况下,电子邮件属性可以重复。我的问题是如何使此电子邮件属性唯一,如用户名?我读过,可以使用UserValidator设置唯一属性,但找不到如何设置。您能告诉我如何使用UserValidator或最好的方法实现

我正在使用visual studio 2013开发一个WEB API asp.net项目,并正在实现用于自定义注册的自定义标识模型。例如,我在RegisterBindingModel中添加了一个电子邮件字段

这就是我所做的:

我添加了电子邮件属性,我需要该属性是唯一的(作为用户名),但默认情况下,电子邮件属性可以重复。我的问题是如何使此电子邮件属性唯一,如用户名?我读过,可以使用UserValidator设置唯一属性,但找不到如何设置。您能告诉我如何使用UserValidator或最好的方法实现这一点吗

用户名属性是如何定义为唯一的?我到处都找不到


谢谢。

有不同的实现方法,但不是现成的。但是,您可以使用

[验证程序(类型(ApplicationUserValidator))]
类应用程序用户:IdentityUser
{
公共字符串电子邮件{get;set;}
//…省略了模型实现
}
公共类ApplicationUserValidator:AbstractValidator
{
公共应用程序Servalidator()
{
RuleFor(x=>x.Email).Must(IsUniqueEmail).WithMessage(“电子邮件已存在”);
}
私人bool-IsUniqueEmail(字符串邮件)
{
var_db=new DataContext();
if(_db.NewModel.SingleOrDefault(x=>x.Email==mail)==null)返回true;
返回false;
}
//对其他属性执行附加验证:
专用布尔IsUniqueTelephoneNumber(字符串编号)
{
//…在这里实施
}
}

我不明白-您是想使用用户的电子邮件地址作为用户名,还是想为用户添加一个额外的属性来保存其电子邮件地址?为什么不将用户名作为电子邮件地址呢?因为我需要用户名属性作为用户名,电子邮件属性作为电子邮件,而我需要知道如何创建唯一属性;这是主要问题。因为谁知道我将来还需要哪些领域被设置为独一无二的呢。感谢您的建议,为ApplicationUser表添加了一个唯一的约束。如何做到这一点将取决于您使用的EF迁移策略。是的,我知道我可以在db级别上做到这一点,但我需要在Asp.net Identity上做到这一点。以前在db级别做过,但我不喜欢这个解决方案,主要是因为我必须通过代码处理错误;但如果我使用Asp.net标识进行处理,错误将存储在模型中。用户名并没有唯一性约束,被设置为唯一的,这就是为什么我会问它是如何生成的;这就是为什么我想这样做,因为我知道这可以通过Asp.net身份来实现;但问题是,我不知道怎么做。你在使用会员提供商吗?没有测试这个解决方案,但我认为这是我需要的。感谢现在提出的解决方案,我认为这是最适合我的问题的解决方案,但有一点我不喜欢,它有一个依赖库。如果没有库,你怎么能做到同样的事情呢?你知道一些例子吗?或者从哪里开始?非常感谢。请在此处检查已接受的答案:。我个人更喜欢FluentValidation,因为我经常使用它。
[Validator(typeof(ApplicationUserValidator))]
class ApplicationUser : IdentityUser
{
    public string Email { get; set; }
    //...Model implementation omitted
}

public class ApplicationUserValidator : AbstractValidator<ApplicationUser>
{
    public ApplicationUserValidator()
    {

        RuleFor(x => x.Email).Must(IsUniqueEmail).WithMessage("Email already exists");
    }
    private bool IsUniqueEmail(string mail)
    {
        var _db = new DataContext();
        if (_db.NewModel.SingleOrDefault(x => x.Email == mail) == null) return true;
        return false;
    }
    //implementing additional validation for other properties:
    private bool IsUniqueTelephoneNumber(string number)
    {
      //...implement here
    }
}