You can make a model property Unique
by using Both DataAnnotation
and FluentApi
as follows:
Using Data Annotation:
[Required]
[StringLength(30)]
[Index("Ix_UserName",Order =1,IsUnique =true)]
public string UserName { get; set; }
Using Fluent Api:
In Entity Framework >= 6.2,
In DbContext
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().Property(u => u.UserName).HasMaxLength(30);
modelBuilder.Entity<User>().HasIndex(u => u.UserName).IsUnique();
}
In Entity Framework < 6.2
In DbContext
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<User>().Property(t => t.UserName).HasMaxLength(30)
.HasColumnAnnotation(IndexAnnotation.AnnotationName, new IndexAnnotation(new IndexAttribute("Ix_UserName"){IsUnique = true}));
}
Remember: With Index
attribute you must have to use StringLength
attribute also.
For making RemoteAttibute
working, write your RemoteAttibute
on UserName
property as follows:
[Required]
[StringLength(30)]
[Index("Ix_UserName",Order =1,IsUnique =true)]
[Remote("IsUserNameExist", "Home", AdditionalFields = "Id", ErrorMessage = "User Name already exists")]
public string UserName { get; set; }
And then the IsUserNameExist
method in the HomeController
as follows:
public JsonResult IsUserNameExist(string UserName, int? Id)
{
var IsUserNameExists = db.Users.Any(x => x.UserName== UserName && x.Id != Id);
return Json(!IsUserNameExists, JsonRequestBehavior.AllowGet);
}
Finally ensure that your view contains the following jQuery
files:
<script src="~/Scripts/jquery-version.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
Everything should work now fine!