我有一个用户控件,其中包含一些名为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中获取新值。
我该如何解决这个问题?
答案 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);
}
}