验证错误后无法识别新输入值

时间:2012-07-19 07:09:11

标签: c# entity-framework code-first

我有一个用户控件,其中包含一些名为textBoxNombre

的文本框

我有一些验证注释,如:

    [Required(ErrorMessage="Debe escribir el Nombre")]
    public String Nombre { get; set; }

这是用于添加新Cliente(客户)的按钮(名为buttonAgregar)的简化代码:

    private void buttonAgregar_Click(object sender, RoutedEventArgs e)
    {
        var cliente = new Cliente
        {
            Nombre = textBoxNombre.Text,
            Apellido1 = textBoxPrimerApellido.Text,
            Apellido2 = textBoxSegundoApellido.Text,
        };

        db.Clientes.Add(cliente);

        try
        {
            db.SaveChanges();
        }
        catch (System.Data.Entity.Validation.DbEntityValidationException exc)
        {
            String mensaje = "";

            foreach (var validationErrors in exc.EntityValidationErrors)
                foreach (var validationError in validationErrors.ValidationErrors)
                    mensaje += validationError.ErrorMessage + "\n";

            MessageBox.Show(mensaje, "Se han encontrado errores", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

如果我将textBoxNombre留空,则触发异常并显示消息框。 然后我在textBoxNombre中键入一些文本,但是当我再次单击buttonAgregar时,会触发异常并再次显示消息框并显示相同的错误消息。 buttonAgregar_Click()方法不会在textBoxNombre中获取新值。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这是因为先前创建的Cliente实例仍然由上下文跟踪,当您调用SaveChanges时,该实体也会得到验证。因此,您将获得验证异常。

如果您收到任何验证错误,请分离该实体。每次单击按钮时,您也可以使用上下文的新实例。

private void buttonAgregar_Click(object sender, RoutedEventArgs e)
{
    var cliente = new Cliente
    {
        Nombre = textBoxNombre.Text,
        Apellido1 = textBoxPrimerApellido.Text,
        Apellido2 = textBoxSegundoApellido.Text,
    };

    db.Clientes.Add(cliente);

    try
    {
        db.SaveChanges();
    }
    catch (System.Data.Entity.Validation.DbEntityValidationException exc)
    {
        String mensaje = "";

        foreach (var validationErrors in exc.EntityValidationErrors)
            foreach (var validationError in validationErrors.ValidationErrors)
                mensaje += validationError.ErrorMessage + "\n";

        db.Entry(cliente).State = EntityState.Detached;

        MessageBox.Show(mensaje, "Se han encontrado errores", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}