Как создать уникальное поле в модели MVC?

Это мой модельный класс в проекте С# MVC. Я хочу установить идентификатор членства как уникальное поле?

public class Customer
{
        public int CustomerID { get; set; }
        public string MembershipID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string EmailAddress { get; set; }
}

person user2901979    schedule 21.10.2013    source источник
comment
Сопоставлен ли этот объект с каким-либо ORM, например EF?   -  person Yair Nevet    schedule 21.10.2013
comment
да, действительно хотите.   -  person Thaven    schedule 21.10.2013
comment
stackoverflow.com/questions/16678625/   -  person Animus Miles-Militis    schedule 21.10.2013
comment
Это проект EF MVC   -  person user2901979    schedule 21.10.2013


Ответы (3)


Entity Framework не поддерживает UNIQUE для атрибутов, поэтому мы должны создать для этого функцию. Советую использовать FluentValidation, легко взять в руки

public class Customer
{
        public int CustomerID { get; set; }
        public string MembershipID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string EmailAddress { get; set; }
}

Вы должны определить набор правил проверки для этого класса, наследуя от

    using FluentValidation;

    public class CustomerValidator : AbstractValidator<Customer> {

    public CustomerValidator() {
        RuleFor(customer => customer.EmailAddress).NotNull().Must(UniqueAddmail);
      }

   public bool UniqueAddmail (string EmailAddress)
        {
            return new AnnuaireDbEntities().Wilaya.FirstOrDefault(x => x.Nom == EmailAddress) == null;
        }
    }
person Allaoua Youcef    schedule 01.05.2019

Я могу только догадываться, так как вы не упомянули, какой ключ в вашем классе.

Entity Framework не поддерживает столбцы unique в соответствии с DataAnnotations. Единственное, что вы можете сделать, это установить один столбец в качестве первичного ключа в сочетании с другим столбцом идентификатора, являющимся Guid.

Предполагая, что CustomerID является вашим первичным ключом:

using System.ComponentModel.DataAnnotations;

public class Customer
{
    [Key]
    public int CustomerID { get; set; }
    public Guid MembershipID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}

предполагая, что ваш MembershipID является вашим первичным ключом:

using System.ComponentModel.DataAnnotations;

public class Customer
{

    public Guid CustomerID { get; set; }
    [Key]
    public int MembershipID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}

Сделав один из столбцов направляющим, ваши шансы сгенерировать 2 ключа с одинаковым значением близки к нулю.

person Marco    schedule 21.10.2013
comment
Не могли бы вы показать мне, как я могу добавить уникальный столбец в класс Context ?? Потому что мне нужно каким-то образом установить идентификатор членства как уникальный. - person user2901979; 21.10.2013
comment
Какой context класс? ДбКонтекст? - person Marco; 21.10.2013

public class Customer
{
    public int CustomerId { get; set; }
    public string MembershipId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}

public class Company
 {
     public string MembershipId { get; set; }
     public string Name {get; set;}

 }
public class CustomersBankAccount
 {
   public string Name {get; set;}
   public int CustomerId { get; set; }
 }

Соглашение, когда вы хотите создать базу данных с первым соглашением о коде, состоит в том, чтобы часть «Id» (внешний ключ) была интегрирована в ваши свойства. Конечно, я рекомендую объявить все свойства виртуальными, чтобы EF мог понять ваш код и активировать некоторые функции. как эффективный механизм отслеживания

Итак: если у вас есть свойство объекта с именем ID, EF предполагает, что свойство содержит значение первичного ключа, и настраивает столбец ключа с автоинкрементом (идентификатор) в SQL Server для хранения значения свойства.

Редактировать:

«На объекте» означает объект Заказчика. По сути, первичный ключ в вашем примере находится в customer , а внешний ключ — во всех других таблицах, связанных с customer. Первичный ключ не может быть дублирован или нулевым. Внешний ключ - да. Возможно, что один и тот же клиент может иметь несколько банковских счетов. :) Так что, если вы задаетесь вопросом, где же сантехника, чтобы установить ключи, остановитесь. MVC может просто посмотреть на приведенный выше код и решить (при выборе строительных лесов), как сделать таблицы в вашей БД. Вам не нужно ничего указывать в своем коде, кроме того, что вы уже видели ("Id" и конец)

Изменить на основе моего комментария:

  public class Customer
{
    public int CustomerId { get; set; }
    [Remote("CheckMembershipIdActionMethod", "CorrespondingController")]
    public string MembershipId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
}
person Iulian Radulescu    schedule 21.10.2013
comment
Если вы рекомендуете, чтобы свойства были виртуальными, почему бы вам не привести пример, сделав MembershipId в классе Customer виртуальным? - person Marco; 21.10.2013
comment
Виртуальные свойства @Serv не требуются, но они дают EF контроль над созданием собственных механизмов. - person Iulian Radulescu; 21.10.2013
comment
CustomerId — это первичный ключ. Идентификатор членства — это уникальное поле, такое как номер национального удостоверения личности. - person user2901979; 21.10.2013
comment
@ user2901979 Хорошо. В этом случае вы можете использовать удаленный атрибут. Его работа состоит в том, чтобы убедиться, что ваша функция выполнена. msdn.microsoft.com/en-us/ библиотека/gg508808%28v=vs.98%29.aspx - person Iulian Radulescu; 21.10.2013