为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
侃侃尔雅 2022-06-19 10:14:19
这是我的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; }}这是控制器中的IsUsernameExists方法Homepublic JsonResult IsUsernameExists(string UserName){                return Json(!db.Users.Any(x => x.Username == UserName), JsonRequestBehavior.AllowGet);}但它不起作用。任何进一步的帮助将不胜感激!
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

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


使用数据注释:

[Required]

[StringLength(30)]

[Index("Ix_UserName",Order =1,IsUnique =true)]

public string UserName { get; set; }

使用流畅的 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();

}

在实体框架 < 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}));

}

请记住:对于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; }

然后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);

}

最后确保您的视图包含以下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>


查看完整回答
反对 回复 2022-06-19
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

RemoteAttribute与实体框架没有任何关系。它只是忽略了这个属性。此外,正如文档所说,它是一个jQuery验证属性,它应该只在前端部分起作用。


如果User同时是 MVC 模型和数据库实体,则应为属性创建唯一索引。一种方法是OnModelCreating在你的方法中DbContext:


protected override void OnModelCreating(ModelBuilder modelBuilder)

{

    modelBuilder.Entity<User>().HasIndex(x => new { x.Username }).IsUnique();

}

然后创建一个迁移,将它应用到数据库,你就可以开始了。但是,请注意保存副本时会遇到的异常,并确保正确处理它。


查看完整回答
反对 回复 2022-06-19
?
长风秋雁

TA贡献1757条经验 获得超7个赞

我在 HomeController 中创建了一个方法


   public bool IsUserExist(string email)

   {

        return db.Users.Where(c => c.Email == email).IsAny();

   } 

并在行动


    if( IsUserExist(model.Email) )

    {

        // my code

    }


查看完整回答
反对 回复 2022-06-19
  • 3 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信