如何首先在实体框架代码中使属性唯一

时间:2018-12-19 13:14:28

标签: c# json entity-framework linq 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; }
}

这是IsUsernameExists控制器中的Home方法

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

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

3 个答案:

答案 0 :(得分:3)

您可以通过同时使用UniqueDataAnnotation来制作模型属性FluentApi,如下所示:

使用数据注释:

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

使用Fluent Api:

在Entity Framework> = 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();
}

在Entity Framework <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>

现在一切正常!

答案 1 :(得分:1)

RemoteAttribute与Entity Framework没有任何关系。它只是忽略此属性。此外,如文档所述,它是一个jQuery验证属性,应该仅在前端部分起作用。

如果User既是MVC模型又是数据库实体,则应为该属性创建唯一索引。一种方法是在您的OnModelCreating中使用DbContext方法:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().HasIndex(x => new { x.Username }).IsUnique();
}

然后创建一个迁移,将其应用于数据库,您就可以开始了。但是,请注意保存重复项时会出现异常,并确保正确处理。

答案 2 :(得分:-1)

我在HomeController中创建一个方法

   public bool IsUserExist(string email)
   {
        return db.Users.Where(c => c.Email == email).IsAny();
   } 

并付诸行动

    if( IsUserExist(model.Email) )
    {
        // my code
    }