1

textBoxNombreと呼ばれるtextBoxのようないくつかのフィールドを持つユーザーコントロールがあります

次のような検証アノテーションがあります。

    [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 に答える