Как сделать свойство уникальным в Entity Framework Code First - PullRequest
0 голосов
/ 19 декабря 2018

Это моя 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 голосов
/ 19 декабря 2018

Вы можете сделать свойство модели Unique, используя Оба DataAnnotation и FluentApi следующим образом:

Используя аннотацию данных:

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

Используя Fluent Api:

В 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();
}

В Entity Framework <6,2 </strong>

В 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>

Теперь все должно работать нормально!

0 голосов
/ 26 декабря 2018

Я создаю метод в HomeController

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

и в действии

    if( IsUserExist(model.Email) )
    {
        // my code
    }
0 голосов
/ 19 декабря 2018

RemoteAttribute не имеет ничего общего с Entity Framework.Он просто игнорирует этот атрибут.Кроме того, как говорится в документации, это атрибут проверки jQuery, он должен работать только с интерфейсной частью.

Если User является и моделью MVC, и объектом базы данных, вы должны создать уникальный индекс длянедвижимость.Один из способов сделать это - метод OnModelCreating в вашем DbContext:

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

Затем создайте миграцию, примените ее к базе данных, и все готово.Однако помните об исключении, которое вы получите при сохранении дубликатов, и убедитесь, что вы правильно его обрабатываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...