如何在 Entity Framework Code First 中使属性唯一

far*_*man 1 c# linq json entity-framework ef-code-first

这是我的User模型类:

public class User 
{
    public int Id { get; set; }

    [Required]
    [MaxLength(100)]
    public string FullName { get; set; }

    [Required]
    [MaxLength(30)]
    [Remote("IsUsernameExists", "Home", HttpMethod = "Post")]
    public string UserName { get; set; }

    [Required]
    [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$"]
    public string Email { get; set; }

    [Required]
    [StringLength(maximumLength: 18, MinimumLength = 8)]
    public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是控制器IsUsernameExists中的方法Home

public JsonResult IsUsernameExists(string UserName)
{            
    return Json(!db.Users.Any(x => x.Username == UserName), JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用。任何进一步的帮助将不胜感激!

Tan*_*jel 5

Unique您可以使用 BothDataAnnotation和来创建模型属性,FluentApi如下所示:

使用数据注释:

[Required]
[StringLength(30)]
[Index("Ix_UserName",Order =1,IsUnique =true)]
public string UserName { get; set; }
Run Code Online (Sandbox Code Playgroud)

使用 Fluent Api:

在实体框架 >= 6.2 中,

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();
}
Run Code Online (Sandbox Code Playgroud)

在实体框架 < 6.2 中

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}));
}
Run Code Online (Sandbox Code Playgroud)

请记住:有了Index属性,您还必须使用StringLength属性。

为了使RemoteAttibute工作正常进行,请按如下方式编写您的 RemoteAttibute属性UserName

[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; }
Run Code Online (Sandbox Code Playgroud)

然后IsUserNameExist方法如下HomeController

public JsonResult IsUserNameExist(string UserName, int? Id)
{
     var IsUserNameExists = db.Users.Any(x => x.UserName== UserName && x.Id != Id);
     return Json(!IsUserNameExists, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

最后确保您的视图包含以下jQuery文件:

<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>
Run Code Online (Sandbox Code Playgroud)

现在一切都应该正常了!