1

我有一个用户控件,其中包含一些字段,例如名为 textBoxNombre 的文本框

我有一些验证注释,例如:

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

这是用于添加新客户(客户)的按钮(称为 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 中获取新值。

我该如何解决这个问题?

4

1 回答 1

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);
    }
}
于 2012-07-19T07:58:51.230 回答