vea varias validacion una solucion para obtener las interna framework exceptions excepción error entradas entityvalidationerrors entidades detalles dbentityvalidationexception data actualizar c# entity-framework entity-framework-4 entity-framework-4.1

c# - varias - get entityvalidationerrors



La validación falló para una o más entidades. Vea la propiedad ''EntityValidationErrors'' para más detalles (25)

Para ser honesto, no sé cómo verificar el contenido de los errores de validación. Visual Studio me muestra que es una matriz con 8 objetos, así que 8 errores de validación.

En realidad, debería ver los errores si profundiza en esa matriz en Visual studio durante la depuración. Pero también puede detectar la excepción y luego escribir los errores en algún almacén de registro o la consola:

try { // Your code... // Could also be before try if you know the exception occurs in SaveChanges context.SaveChanges(); } catch (DbEntityValidationException e) { foreach (var eve in e.EntityValidationErrors) { Console.WriteLine("Entity of type /"{0}/" in state /"{1}/" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State); foreach (var ve in eve.ValidationErrors) { Console.WriteLine("- Property: /"{0}/", Error: /"{1}/"", ve.PropertyName, ve.ErrorMessage); } } throw; }

EntityValidationErrors es una colección que representa las entidades que no se pudieron validar con éxito, y la colección interna ValidationErrors por entidad es una lista de errores a nivel de propiedad.

Estos mensajes de validación suelen ser lo suficientemente útiles para encontrar el origen del problema.

Editar

Algunas mejoras leves:

El valor de la propiedad infractora se puede incluir en el bucle interno de la siguiente manera:

foreach (var ve in eve.ValidationErrors) { Console.WriteLine("- Property: /"{0}/", Value: /"{1}/", Error: /"{2}/"", ve.PropertyName, eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName), ve.ErrorMessage); }

Aunque la depuración de Debug.Write puede ser preferible a la de Console.WriteLine ya que funciona en todo tipo de aplicaciones, no solo en aplicaciones de consola (gracias a @Bart por su nota en los comentarios a continuación).

Para las aplicaciones web que están en producción y que usan Elmah para el registro de excepciones, me resultó muy útil para crear una excepción personalizada y sobrescribir SaveChanges para lanzar esta nueva excepción.

El tipo de excepción personalizado se ve así:

public class FormattedDbEntityValidationException : Exception { public FormattedDbEntityValidationException(DbEntityValidationException innerException) : base(null, innerException) { } public override string Message { get { var innerException = InnerException as DbEntityValidationException; if (innerException != null) { StringBuilder sb = new StringBuilder(); sb.AppendLine(); sb.AppendLine(); foreach (var eve in innerException.EntityValidationErrors) { sb.AppendLine(string.Format("- Entity of type /"{0}/" in state /"{1}/" has the following validation errors:", eve.Entry.Entity.GetType().FullName, eve.Entry.State)); foreach (var ve in eve.ValidationErrors) { sb.AppendLine(string.Format("-- Property: /"{0}/", Value: /"{1}/", Error: /"{2}/"", ve.PropertyName, eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName), ve.ErrorMessage)); } } sb.AppendLine(); return sb.ToString(); } return base.Message; } } }

Y SaveChanges se puede sobrescribir de la siguiente manera:

public class MyContext : DbContext { // ... public override int SaveChanges() { try { return base.SaveChanges(); } catch (DbEntityValidationException e) { var newException = new FormattedDbEntityValidationException(e); throw newException; } } }

Algunas observaciones:

  • La pantalla de error amarilla que muestra Elmah en la interfaz web o en los correos electrónicos enviados (si lo ha configurado) ahora muestra los detalles de la validación directamente en la parte superior del mensaje.

  • Sobrescribir la propiedad del Message en la excepción personalizada en lugar de sobrescribir a ToString() tiene la ventaja de que la "Pantalla amarilla de la muerte (YSOD) estándar de ASP.NET también muestra este mensaje. A diferencia de Elmah, el YSOD aparentemente no usa ToString() , pero ambos muestran la propiedad Message .

  • Al DbEntityValidationException la excepción DbEntityValidationException como una excepción interna, se garantiza que el seguimiento de la pila original seguirá estando disponible y se muestra en Elmah y YSOD.

  • Al establecer un punto de interrupción en la línea, se throw newException; simplemente puede inspeccionar la propiedad newException.Message como un texto en lugar de newException.Message en las colecciones de validación, que es un poco incómodo y no parece funcionar fácilmente para todos (vea los comentarios a continuación).

Estoy teniendo este error al sembrar mi base de datos con el primer enfoque de código.

La validación falló para una o más entidades. Vea la propiedad ''EntityValidationErrors'' para más detalles.

Para ser honesto, no sé cómo verificar el contenido de los errores de validación. Visual Studio me muestra que es una matriz con 8 objetos, así que 8 errores de validación.

Esto funcionaba con mi modelo anterior, pero hice algunos cambios que explico a continuación:

  • Tuve una enumeración llamada Status, la cambié a una clase llamada Status
  • Cambié la clase ApplicantsPositionHistory para tener 2 claves externas en la misma tabla

Disculpe por el código largo, pero tengo que pegarlo todo. La excepción se lanza en la última línea del siguiente código.

namespace Data.Model { public class Position { [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)] public int PositionID { get; set; } [Required(ErrorMessage = "Position name is required.")] [StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")] [Display(Name = "Position name")] public string name { get; set; } [Required(ErrorMessage = "Number of years is required")] [Display(Name = "Number of years")] public int yearsExperienceRequired { get; set; } public virtual ICollection<ApplicantPosition> applicantPosition { get; set; } } public class Applicant { [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)] public int ApplicantID { get; set; } [Required(ErrorMessage = "Name is required")] [StringLength(20, MinimumLength = 3, ErrorMessage="Name should not be longer than 20 characters.")] [Display(Name = "First and LastName")] public string name { get; set; } [Required(ErrorMessage = "Telephone number is required")] [StringLength(10, MinimumLength = 3, ErrorMessage = "Telephone should not be longer than 20 characters.")] [Display(Name = "Telephone Number")] public string telephone { get; set; } [Required(ErrorMessage = "Skype username is required")] [StringLength(10, MinimumLength = 3, ErrorMessage = "Skype user should not be longer than 20 characters.")] [Display(Name = "Skype Username")] public string skypeuser { get; set; } public byte[] photo { get; set; } public virtual ICollection<ApplicantPosition> applicantPosition { get; set; } } public class ApplicantPosition { [Key] [Column("ApplicantID", Order = 0)] public int ApplicantID { get; set; } [Key] [Column("PositionID", Order = 1)] public int PositionID { get; set; } public virtual Position Position { get; set; } public virtual Applicant Applicant { get; set; } [Required(ErrorMessage = "Applied date is required")] [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] [Display(Name = "Date applied")] public DateTime appliedDate { get; set; } [Column("StatusID", Order = 0)] public int StatusID { get; set; } public Status CurrentStatus { get; set; } //[NotMapped] //public int numberOfApplicantsApplied //{ // get // { // int query = // (from ap in Position // where ap.Status == (int)Status.Applied // select ap // ).Count(); // return query; // } //} } public class Address { [StringLength(20, MinimumLength = 3, ErrorMessage = "Country should not be longer than 20 characters.")] public string Country { get; set; } [StringLength(20, MinimumLength = 3, ErrorMessage = "City should not be longer than 20 characters.")] public string City { get; set; } [StringLength(50, MinimumLength = 3, ErrorMessage = "Address should not be longer than 50 characters.")] [Display(Name = "Address Line 1")] public string AddressLine1 { get; set; } [Display(Name = "Address Line 2")] public string AddressLine2 { get; set; } } public class ApplicationPositionHistory { [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)] public int ApplicationPositionHistoryID { get; set; } public ApplicantPosition applicantPosition { get; set; } [Column("oldStatusID")] public int oldStatusID { get; set; } [Column("newStatusID")] public int newStatusID { get; set; } public Status oldStatus { get; set; } public Status newStatus { get; set; } [StringLength(500, MinimumLength = 3, ErrorMessage = "Comments should not be longer than 500 characters.")] [Display(Name = "Comments")] public string comments { get; set; } [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] [Display(Name = "Date")] public DateTime dateModified { get; set; } } public class Status { [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)] public int StatusID { get; set; } [StringLength(20, MinimumLength = 3, ErrorMessage = "Status should not be longer than 20 characters.")] [Display(Name = "Status")] public string status { get; set; } } }

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Entity; using System.IO; namespace Data.Model { public class HRContextInitializer : DropCreateDatabaseAlways<HRContext> { protected override void Seed(HRContext context) { #region Status Status applied = new Status() { status = "Applied" }; Status reviewedByHR = new Status() { status = "Reviewed By HR" }; Status approvedByHR = new Status() { status = "Approved by HR" }; Status rejectedByHR = new Status() { status = "Rejected by HR" }; Status assignedToTechnicalDepartment = new Status() { status = "Assigned to Technical Department" }; Status approvedByTechnicalDepartment = new Status() { status = "Approved by Technical Department" }; Status rejectedByTechnicalDepartment = new Status() { status = "Rejected by Technical Department" }; Status assignedToGeneralManager = new Status() { status = "Assigned to General Manager" }; Status approvedByGeneralManager = new Status() { status = "Approved by General Manager" }; Status rejectedByGeneralManager = new Status() { status = "Rejected by General Manager" }; context.Status.Add(applied); context.Status.Add(reviewedByHR); context.Status.Add(approvedByHR); context.Status.Add(rejectedByHR); context.Status.Add(assignedToTechnicalDepartment); context.Status.Add(approvedByTechnicalDepartment); context.Status.Add(rejectedByTechnicalDepartment); context.Status.Add(assignedToGeneralManager); context.Status.Add(approvedByGeneralManager); context.Status.Add(rejectedByGeneralManager); #endregion #region Position Position netdeveloper = new Position() { name = ".net developer", yearsExperienceRequired = 5 }; Position javadeveloper = new Position() { name = "java developer", yearsExperienceRequired = 5 }; context.Positions.Add(netdeveloper); context.Positions.Add(javadeveloper); #endregion #region Applicants Applicant luis = new Applicant() { name = "Luis", skypeuser = "le.valencia", telephone = "0491732825", photo = File.ReadAllBytes(@"C:/Users/LUIS.SIMBIOS/Documents/Visual Studio 2010/Projects/SlnHR/HRRazorForms/Content/pictures/1.jpg") }; Applicant john = new Applicant() { name = "John", skypeuser = "jo.valencia", telephone = "3435343543", photo = File.ReadAllBytes(@"C:/Users/LUIS.SIMBIOS/Documents/Visual Studio 2010/Projects/SlnHR/HRRazorForms/Content/pictures/2.jpg") }; context.Applicants.Add(luis); context.Applicants.Add(john); #endregion #region ApplicantsPositions ApplicantPosition appicantposition = new ApplicantPosition() { Applicant = luis, Position = netdeveloper, appliedDate = DateTime.Today, StatusID = 1 }; ApplicantPosition appicantposition2 = new ApplicantPosition() { Applicant = john, Position = javadeveloper, appliedDate = DateTime.Today, StatusID = 1 }; context.ApplicantsPositions.Add(appicantposition); context.ApplicantsPositions.Add(appicantposition2); #endregion context.SaveChanges(); --->> Error here } } }


Aquí hay otra forma de hacerlo en lugar de usar bucles foreach para mirar dentro de EntityValidationErrors. Por supuesto que puedes formatear el mensaje a tu gusto:

try { // your code goes here... } catch (DbEntityValidationException ex) { Console.Write($"Validation errors: {string.Join(Environment.NewLine, ex.EntityValidationErrors.SelectMany(vr => vr.ValidationErrors.Select(err => $"{err.PropertyName} - {err.ErrorMessage}")))}", ex); throw; }


Aquí le mostramos cómo puede verificar el contenido de los EntityValidationErrors en Visual Studio (sin escribir ningún código adicional), es decir, durante la depuración en el IDE .

¿El problema?

Tiene razón, la EntityValidationErrors emergente Ver detalles del depurador de Visual Studio no muestra los errores reales dentro de la colección EntityValidationErrors .

¡La solución!

Simplemente agregue la siguiente expresión en una ventana de Observación rápida y haga clic en Reevaluar .

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

En mi caso, vea cómo puedo expandirme a la List ValidationErrors dentro de la colección EntityValidationErrors

Referencias: http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/ , @ yoel''s answer


Capture la excepción en un try catch y luego quick watch o ctrl + d & ctrl + q y puede profundizar en EntityValidationErrors.


Como se mencionó en otras publicaciones, simplemente capture la excepción en la clase DbEntityValidationException. Lo que le dará lo que sea necesario durante los casos de error.

try { .... } catch(DbEntityValidationException ex) { .... }


En la depuración, puede ingresar esto en el campo de entrada del evaluador de expresiones QuickWatch:

context.GetValidationErrors()


Esto funciona para mi

var modelState = ModelState.Values; if (!ModelState.IsValid) { return RedirectToAction("Index", "Home", model); }

Ponga un punto de interrupción en la declaración if. A continuación, puede comprobar modelState en las ventanas de depuración. En cada valor puede ver si hay un error e incluso el mensaje de error. Eso es. Cuando ya no lo necesite, simplemente elimine o comente la línea.

Espero que esto sea de ayuda.

Si se me solicita, puedo proporcionar una captura de pantalla detallada en la ventana de depuración.


Esto realmente podría hacerlo sin tener que escribir código:

En su bloque catch, agregue un punto de ruptura en la siguiente línea de código:

catch (Exception exception) { }

Ahora, si se desplaza sobre una exception o la agrega al Watch y luego navega a los detalles de la excepción como se muestra a continuación; verá qué columnas en particular están causando el problema, ya que este error generalmente ocurre cuando se viola una restricción de tabla.

Imagen grande


La respuesta de @Slauma es realmente genial, pero descubrí que no funcionaba cuando una propiedad ComplexType no era válida.

Por ejemplo, supongamos que tiene un Phone de propiedad del tipo complejo PhoneNumber . Si la propiedad AreaCode no es válida, el nombre de la propiedad en ve.PropertyNames es "Phone.AreaCode". Esto hace que la llamada a eve.Entry.CurrentValues<object>(ve.PropertyName) falle.

Para solucionar esto, puede dividir el nombre de la propiedad en cada uno . , luego recuenta a través de la matriz resultante de nombres de propiedades. Finalmente, cuando llegue al final de la cadena, simplemente puede devolver el valor de la propiedad.

A continuación se encuentra la clase FormattedDbEntityValidationException @ Slauma con soporte para ComplexTypes.

¡Disfrutar!

[Serializable] public class FormattedDbEntityValidationException : Exception { public FormattedDbEntityValidationException(DbEntityValidationException innerException) : base(null, innerException) { } public override string Message { get { var innerException = InnerException as DbEntityValidationException; if (innerException == null) return base.Message; var sb = new StringBuilder(); sb.AppendLine(); sb.AppendLine(); foreach (var eve in innerException.EntityValidationErrors) { sb.AppendLine(string.Format("- Entity of type /"{0}/" in state /"{1}/" has the following validation errors:", eve.Entry.Entity.GetType().FullName, eve.Entry.State)); foreach (var ve in eve.ValidationErrors) { object value; if (ve.PropertyName.Contains(".")) { var propertyChain = ve.PropertyName.Split(''.''); var complexProperty = eve.Entry.CurrentValues.GetValue<DbPropertyValues>(propertyChain.First()); value = GetComplexPropertyValue(complexProperty, propertyChain.Skip(1).ToArray()); } else { value = eve.Entry.CurrentValues.GetValue<object>(ve.PropertyName); } sb.AppendLine(string.Format("-- Property: /"{0}/", Value: /"{1}/", Error: /"{2}/"", ve.PropertyName, value, ve.ErrorMessage)); } } sb.AppendLine(); return sb.ToString(); } } private static object GetComplexPropertyValue(DbPropertyValues propertyValues, string[] propertyChain) { var propertyName = propertyChain.First(); return propertyChain.Count() == 1 ? propertyValues[propertyName] : GetComplexPropertyValue((DbPropertyValues)propertyValues[propertyName], propertyChain.Skip(1).ToArray()); } }


Lo que encontré ... cuando recibí el error ''EntityValidationErrors'' es que ... tengo un campo en mi base de datos ''db1'' en la tabla ''tbladdress'' como ''address1'' que tiene un tamaño de 100 (es decir, varchar de la dirección (100) nulo) y pasé un valor de más de 100 caracteres ... y esto lleva a un error al guardar datos en la base de datos ...

Por lo que debe comprobar los datos que está pasando al campo.


Me enfrenté a este error antes

cuando intenté actualizar un campo específico en mi modelo en el marco de la entidad

Letter letter = new Letter {ID = letterId, ExportNumber = letterExportNumber,EntityState = EntityState.Modified}; LetterService.ChangeExportNumberfor(letter); //---------- public int ChangeExportNumber(Letter letter) { int result = 0; using (var db = ((LettersGeneratorEntities) GetContext())) { db.Letters.Attach(letter); db.Entry(letter).Property(x => x.ExportNumber).IsModified = true; result += db.SaveChanges(); } return result; }

y según las respuestas anteriores.

Encontré el mensaje de validación. The SignerName field is required.

que apunta al campo en mi modelo

y cuando comprobé el esquema de mi base de datos encontré

por lo tanto, Coure ValidationException tiene su derecho a aumentar

y de acuerdo con este campo quiero que sea anulable, (no sé cómo lo ensucié)

así que cambié ese campo para permitir Null, y con esto mi código no me dará este error otra vez

así que este error tal vez suceda si invalida la integridad de sus datos de su base de datos


Mientras está en el modo de depuración dentro del bloque catch {...} , abra la ventana "QuickWatch" ( ctrl + alt + q ) y péguelo allí:

((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors

o:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

Si no está en un try / catch o no tiene acceso al objeto de excepción.

Esto le permitirá profundizar en el árbol de ValidationErrors . Es la forma más fácil que he encontrado para obtener una visión instantánea de estos errores.


Para obtener una manera rápida de ver el primer error sin siquiera agregar un reloj, puede pegarlo en la ventana Inmediato:

((System.Data.Entity.Validation.DbEntityValidationException)$exception) .EntityValidationErrors.First() .ValidationErrors.First()


Para quien trabaja en VB.NET

Try Catch ex As DbEntityValidationException For Each a In ex.EntityValidationErrors For Each b In a.ValidationErrors Dim st1 As String = b.PropertyName Dim st2 As String = b.ErrorMessage Next Next End Try


Puede hacerlo desde Visual Studio durante la depuración sin escribir ningún código, ni siquiera un bloque catch.

Solo agrega un reloj con el nombre:

((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors

La $exception expresión de observación $exception muestra cualquier excepción lanzada en el contexto actual, incluso si no se ha detectado y asignado a una variable.

Basado en http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/


Según la respuesta de @ Slauma y la sugerencia de @ Milton, extendí el método de guardado personalizado de nuestra clase base con un try / catch que manejará (¡y por lo tanto registrará en nuestro registro de errores!) Este tipo de excepciones.

// Where `BaseDB` is your Entities object... (it could be `this` in a different design) public void Save(bool? validateEntities = null) { try { //Capture and set the validation state if we decide to bool validateOnSaveEnabledStartState = BaseDB.Configuration.ValidateOnSaveEnabled; if (validateEntities.HasValue) BaseDB.Configuration.ValidateOnSaveEnabled = validateEntities.Value; BaseDB.SaveChanges(); //Revert the validation state when done if (validateEntities.HasValue) BaseDB.Configuration.ValidateOnSaveEnabled = validateOnSaveEnabledStartState; } catch (DbEntityValidationException e) { StringBuilder sb = new StringBuilder(); foreach (var eve in e.EntityValidationErrors) { sb.AppendLine(string.Format("Entity of type /"{0}/" in state /"{1}/" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State)); foreach (var ve in eve.ValidationErrors) { sb.AppendLine(string.Format("- Property: /"{0}/", Error: /"{1}/"", ve.PropertyName, ve.ErrorMessage)); } } throw new DbEntityValidationException(sb.ToString(), e); } }


Si está utilizando IIS con Windows Authentification y Entity Framework , tenga cuidado de usar authorize .

Intenté realizar POST sin autorizar y no funcionó, y obtengo este error en db.SaveChangesAsync(); , mientras que todos los demás verbos GET y DELETE estaban trabajando.

Pero cuando agregué AuthorizeAttribute como anotación, funcionó.

[Authorize] public async Task<IHttpActionResult> Post(...){ .... }


Si simplemente está detectando una excepción genérica, puede beneficiarse de emitir esto como una DbEntityValidationException . Este tipo de excepción tiene una propiedad de errores de validación, y si continúa expandiéndose en ella, encontrará todos los problemas.

Por ejemplo, si pones un punto de ruptura en la captura, puedes lanzar lo siguiente en un reloj:

((System.Data.Entity.Validation.DbEntityValidationException ) ex)

Un ejemplo de un error es si un campo no permite nulos, y tiene una cadena nula, verá que dice que el campo es obligatorio.


Solo tirando mis dos centavos en ...

Dentro de mi dbConfiguration.cs, me gusta envolver mi método context.SaveChanges () en un try / catch y producir un archivo de texto de salida que me permita leer el (los) Error (s) claramente, y este código también los marca la fecha, lo cual es útil si ejecutar en más de un error en diferentes momentos!

try { context.SaveChanges(); } catch (DbEntityValidationException e) { //Create empty list to capture Validation error(s) var outputLines = new List<string>(); foreach (var eve in e.EntityValidationErrors) { outputLines.Add( $"{DateTime.Now}: Entity of type /"{eve.Entry.Entity.GetType().Name}/" in state /"{eve.Entry.State}/" has the following validation errors:"); outputLines.AddRange(eve.ValidationErrors.Select(ve => $"- Property: /"{ve.PropertyName}/", Error: /"{ve.ErrorMessage}/"")); } //Write to external file File.AppendAllLines(@"c:/temp/dbErrors.txt", outputLines); throw; }


Tenga en cuenta que Entity.GetType().BaseType.Name proporciona el nombre del tipo que especificó, no el que tiene todos los dígitos hexadecimales en su nombre.


Tuve que escribir esto en la ventana Inmediato: 3

(((exception as System.Data.Entity.Validation.DbEntityValidationException).EntityValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbEntityValidationResult>)[0].ValidationErrors as System.Collections.Generic.List<System.Data.Entity.Validation.DbValidationError>)[0]

Con el fin de profundizar en el error exacto!


Usando la respuesta de @Slauma, he hecho un fragmento de código (un envolvente con fragmento de código) para un mejor uso.

<?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <SnippetTypes> <SnippetType>SurroundsWith</SnippetType> </SnippetTypes> <Title>ValidationErrorsTryCatch</Title> <Author>Phoenix</Author> <Description> </Description> <HelpUrl> </HelpUrl> <Shortcut> </Shortcut> </Header> <Snippet> <Code Language="csharp"><![CDATA[try { $selected$ $end$ } catch (System.Data.Entity.Validation.DbEntityValidationException e) { foreach (var eve in e.EntityValidationErrors) { Console.WriteLine("Entity of type /"{0}/" in state /"{1}/" has the following validation errors:", eve.Entry.Entity.GetType().Name, eve.Entry.State); foreach (var ve in eve.ValidationErrors) { Console.WriteLine("- Property: /"{0}/", Error: /"{1}/"", ve.PropertyName, ve.ErrorMessage); } } throw; }]]></Code> </Snippet> </CodeSnippet> </CodeSnippets>


Verifique el valor de los campos que está pasando, son válidos y de acuerdo con los campos de la base de datos. Por ejemplo, el número de caracteres pasados ​​en un campo particular es menor que los caracteres definidos en el campo de la tabla de la base de datos.


Verifique si tiene la restricción Not Null en las columnas de su tabla y si no pasa el valor de esa columna mientras realiza las operaciones de inserción / actualización. Eso causa esta excepción en el marco de la entidad.


simplemente revise la longitud de campo de su tabla de base de datos. Su texto de entrada es mayor que la longitud de la longitud del tipo de datos del campo de columna