Use in the Controller a method that looks for cpf and also a method that verifies if the CPF is valid in the same method
private void ValidaCpf(Aluno aluno)
{
if (aluno.cpf != null)
{
Aluno duplicatealuno = db.Alunos
.Where(d => d.cpf == aluno.cpf)
.FirstOrDefault();
//verifica se o Cpf ´´e igual ao existente e verifica se o id é diferente do aluno cadastrado com o CPF
if (duplicatealuno != null && duplicatealuno.cpf == aluno.cpf && duplicatealuno.id != aluno.id)
{
string errorMessage = String.Format(
"CPF já cadastrado no sistema");
//defina qual campo irá receber a mensagem e a mensagem
ModelState.AddModelError("cpf", errorMessage);
}
if (!CpfValido(aluno.cpf))
{
string errorMessage = String.Format(
"CPF inválido");
ModelState.AddModelError("aluno.cpf", errorMessage);
}
}
}
#region Helpers
public bool CpfValido(string cpf)
{
int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
string tempCpf;
string digito;
int soma;
int resto;
cpf = cpf.Trim();
cpf = cpf.Replace(".", "").Replace("-", "");
if (cpf.Length != 11)
return false;
tempCpf = cpf.Substring(0, 9);
soma = 0;
for (int i = 0; i < 9; i++)
soma += int.Parse(tempCpf[i].ToString()) * multiplicador1[i];
resto = soma % 11;
if (resto < 2)
resto = 0;
else
resto = 11 - resto;
digito = resto.ToString();
tempCpf = tempCpf + digito;
soma = 0;
for (int i = 0; i < 10; i++)
soma += int.Parse(tempCpf[i].ToString()) * multiplicador2[i];
resto = soma % 11;
if (resto < 2)
resto = 0;
else
resto = 11 - resto;
digito = digito + resto.ToString();
return cpf.EndsWith(digito);
}
#endregion
And before saving use the
ValidaCpf(aluno);
//Caso o cpf exista ele ira mostrar a mensagem
if (ModelState.IsValid)
{}
You can add the single field definition in the model, I'm not sure if it works at all, or if that is your case.
[Display(Name = "CPF")]
[Required(ErrorMessage = "Por favor, preencher o campo CPF.")]
[Index("INDEX_CPF2", IsUnique = true)]
[StringLength(14)]
public string cpf { get; set; }