하나 이상의 항목에 대한 유효성 검사에 실패했습니다. 자세한 내용은 'EntityValidationErrors'속성을 참조하세요.
코드 우선 접근 방식으로 데이터베이스를 시드 할 때이 오류가 발생합니다.
하나 이상의 항목에 대한 유효성 검사에 실패했습니다. 자세한 내용은 'EntityValidationErrors'속성을 참조하세요.
솔직히 저는 유효성 검사 오류의 내용을 확인하는 방법을 확인합니다. Visual Studio는 8 개의 개체가있는 배열이 표시됩니다.
이것은 이전 모델에서 작동하지 않았지만 아래에서 설명하는 몇 가지 변경 사항을 적용했습니다.
- Status라는 열거 형이 변경되었습니다.
- 동일한 테이블에 대한 2 개의 외래 키를 갖도록 ApplicantsPositionHistory 클래스를 변경했습니다.
긴 코드로 인해 실례는 모든 것을 가지고 있어야합니다. 예외는 다음 코드의 마지막 줄에서 발생합니다.
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
}
}
}
솔직히 저는 유효성 검사 오류의 내용을 확인하는 방법을 확인합니다. Visual Studio는 8 개의 개체가있는 배열이 표시됩니다.
실제로 디버그 중에 Visual Studio에서 해당 배열을 드릴하면 오류가 표시됩니다. 그러나 예외적 인 경우 다음 일부 로깅 저장소 또는 콘솔에 오류를 기록 할 수도 있습니다.
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
콜렉션으로 할 수없는 공연을 ValidationErrors
콜렉션 콜렉션 이고 공연 내부 콜렉션 은 속성 수준의 오류 목록입니다.
이러한 유효성 검사 메시지는 일반적으로 문제의 원인을 찾는 데 충분히 유용합니다.
편집하다
약간의 개선 사항 :
문제가되는 속성 의 값 은 다음과 같이 내부 루프에 있습니다.
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);
}
디버깅 Debug.Write
은 Console.WriteLine
콘솔 응용 프로그램뿐만 아니라 모든 종류의 응용 프로그램에서 작동하기 때문에 더 바람직 할 수 있지만 아래 주석에, 대한 @Bart에게 감사드립니다.
프로덕션 중이고 예외 로깅에 ELMAH 를 사용하는 웹 애플리케이션의 SaveChanges
경우이 새로운 예외를 발생시키기 위해 user-지정 예외를 만들고 덮어 쓰는 것이 매우 유용하다는 것이 밝혀졌습니다 .
사용자 정의 예외 유형은 다음과 가변합니다.
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;
}
}
}
그리고 SaveChanges
다음과 같은 방법으로 사용할 수 있습니다.
public class MyContext : DbContext
{
// ...
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (DbEntityValidationException e)
{
var newException = new FormattedDbEntityValidationException(e);
throw newException;
}
}
}
몇 가지 언급 :
Elmah가 웹 인터페이스 또는 보낸 이메일 (구성한 경우)에 표시되는 노란색 오류 화면은 이제 메시지 상단에 직접 유효성 검사 세부 정보를 표시합니다.
덮어
Message
쓰는 대신 user-지정 예외에서 속성을 덮어 쓰면ToString()
표준 ASP.NET "노란색 화면 죽음의 (YSOD)"도이 메시지를 표시하는 이점이 있습니다. Elmah와 달리 YSOD는 분명히 사용하지ToString()
않지만 둘 다Message
속성을 표시합니다 .원본은
DbEntityValidationException
내부 예외로 래핑하면 원본 스택 추적을 계속 사용할 수 있으며 Elmah 및 YSOD에 표시됩니다.줄에 중단 점을 설정하면 조금 어색하고 모든 사람에게 쉽게 작동하지 않는 것 같은 유효성 검사 컬렉션으로 드릴하는 대신 속성을 텍스트로
throw newException;
간단히 검사 할 수 있습니다newException.Message
(아래 주석 참조).
코드를 작성하지 않는 것이 있습니다. Visual Studio에서이를 수행 할 수 있습니다.
다음 이름으로 시계를 추가하면됩니다.
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
조사 식은 $exception
현재 상황에서 존재하는 경우를 선택하여 변수에 할당하지 않은 경우에도 표시됩니다.
http://mattrandle.me/viewing-entityvalidationerrors-in-visual-studio/ 기반
이것은 실제로 코드를 작성하지 할 수 있습니다.
catch 블록에서 다음 코드 줄에 중단 점을 추가합니다.
catch (Exception exception)
{
}
이제 마우스를 가져 exception
가거나 추가 Watch
한 다음 예외 예외 정보로 이동합니다. 이 오류는 일반적으로 테이블 제약 조건을 위반할 때 발생하는 오류 문제를 특정 열을 확인할 수 있습니다.
추가 코드를 작성하지 않고 Visual Studio 에서 EntityValidationErrors 의 내용을 확인할 수있는 방법은 다음과 있습니다. 즉 , IDE 에서 귀하가 하는 동안 입니다.
문제?
맞습니다. Visual Studio 디버거의 세부 정보보기 팝업은 EntityValidationErrors
컬렉션 내부의 실제 오류를 표시하지 않습니다 .
해결책!
Quick Watch 창 에 다음 항목을 추가하고 재평가를 클릭하십시오 .
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
제 경우 ValidationErrors
List
에는 EntityValidationErrors
컬렉션 내부 로 확장 할 수있는 방법을 확인하세요.
참조 : mattrandle.me 블로그 게시물 , @yoel 의 답변
시계를 추가하지 않아도 첫 번째 오류를 신속하게 선택하고 직접 실행 창에 넣을 수 있습니다.
((System.Data.Entity.Validation.DbEntityValidationException)$exception)
.EntityValidationErrors.First()
.ValidationErrors.First()
일하는 사람을 위해 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
catch {...}
블록 내에서 디버그-mode에있는 동안 "간략한"창 ( ctrl+ alt+ q)을 열고 여기에 붙여 넣습니다.
((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors
또는 :
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
try / catch에 있지 않은 예외 개체에 대한 액세스 권한이없는 경우.
이렇게하면 ValidationErrors
트리 로 드릴 다운 할 수 있습니다 . 성공적인 오류에 대한 실행 인을 사용하는 방법입니다.
일반 예외를 실행하는 경우 DbEntityValidationException을 캐스팅하는 것이 도움이 될 수 있습니다 . 이 유형의 예외는 유효성 검사 오류 속성이 계속해서 확장하면 모든 문제를 해결할 수 있습니다.
예를 들어 캐치에 브레이크 포인트를 제안면 다음을 시계에 던질 수 있습니다.
((System.Data.Entity.Validation.DbEntityValidationException ) ex)
오류의 예는 필드가 널을 허용하지 않고 널 소유하고있는 경우 필드가 필수라는 메시지가 표시되는 것입니다.
디버그에서 QuickWatch 사용 설정 기 입력 필드에 다음을 입력 할 수 있습니다.
context.GetValidationErrors()
데이터베이스 테이블 필드 길이를 확인하십시오. 입력 텍스트가 열 필드 데이터 유형 길이의 길이보다 먹을 것입니다.
직접 실행 창에 작성해야합니다. : 삼
(((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]
정확한 오류에 대한 내용!
@Slauma의 대답은 정말 훌륭하지만 ComplexType 속성이 유효하지 않습니다.
예를 들어 Phone
복합 유형 의 특성 이 입증 가정하십시오 PhoneNumber
. 경우 AreaCode
속성이 유효하지 않습니다. 속성 이름은 ve.PropertyNames
"Phone.AreaCode"입니다. 이로 인해 호출 eve.Entry.CurrentValues<object>(ve.PropertyName)
이 실패합니다.
이 문제를 해결 비용별로 속성 이름을 분할 .
한 다음 결과 속성 이름 배열을 반복합니다. 마지막으로 체인의 맨 아래에 도착하면 간단히 속성 값을 반환 할 수 있습니다.
아래는 FormattedDbEntityValidationException
ComplexTypes를 지원하는 @Slauma의 클래스입니다.
즐겨!
[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());
}
}
Entity.GetType().BaseType.Name
이름에 모든 16 숫자가있는 진수 것이 아니라 지정한 유형 이름 을 제공합니다.
@Slauma의 답변과 @Milton의 제안에 따라 다음 종류의 예외를 처리 (사용 오류 로깅에 로그인!)하는 try / catch를 사용하여 기본 클래스의 사용자 지정 저장 방법을 확장했습니다.
// 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);
}
}
@Slauma의 대답을 사용하여 더 나은 사용을 위해 코드 니펫 (스 니펫으로 임)을 만들었습니다.
<?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>
다음 빠른 조사 또는 ctrl + d & ctrl + q에서 EntityValidationErrors로 드릴 다운 할 수 있습니다.
그냥 내 2 센트를 ...
내 dbConfiguration.cs 내에서 context.SaveChanges () 메서드를 try / catch로 래핑하고 오류를 명확하게 읽을 수있는 출력 텍스트 파일을 생성 하고이 코드도 타임 스탬프를 찍습니다. 서로 다른 시간에 하나 이상의 오류가 발생합니다!
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;
}
내가 널 것은 ... 'EntityValidationErrors'오류가 발생했을 때 ... 'tbladdress'테이블의 데이터베이스 'db1'에 크기가 100 인 'address1'(즉, 주소 varchar (100) null) 및 100 이상의 자 값을 전달하고 있었는데 이로 인해 데이터베이스에 데이터를 저장하는 동안 오류가 발생했습니다 ....
따라서 필드에 전달하는 데이터를 확인해야합니다.
이것은 나를 위해 작동합니다.
var modelState = ModelState.Values;
if (!ModelState.IsValid)
{
return RedirectToAction("Index", "Home", model);
}
문에 중단 된 점을 중단하면. 그런 다음 디버그 창에서 modelState를 확인할 수 있습니다. 모든 값에서 오류 및 오류 메시지가 있는지 확인할 수 있습니다. 그게 다야. 더 이상 필요하지 않을 줄을 삭제하거나 주석을 달면됩니다.
이것이 도움이되기를 바랍니다.
요청이 있으면 디버그 창에 자세한 스크린 샷을 제공 할 수 있습니다.
다른 게시물에서 언급했듯이 DbEntityValidationException 클래스에서 예외를 처리합니다. 오류 발생 중에 필요한 모든 것을 제공합니다.
try
{
....
}
catch(DbEntityValidationException ex)
{
....
}
나는 전에이 오류에 직면했다.
-frame 워크에서 엔티티 모델의 특정 필드 를 업데이트 하려고 할 때
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;
}
그리고 위의 답변에 따르면
유효성 검사 메시지를 찾았습니다. The SignerName field is required.
내 모델의 필드를 포함
내 데이터베이스 스키마를 확인했을 때
그래서 off coure ValidationException
는 올릴 권리가 있습니다
이 필드에 따르면 nullable이 있습니다. (어떻게 엉망인지 모르겠습니다)
그래서 나는 Null을 허용하도록 그 필드를 변경하고, 이것에 의해 내 코드가 다시이 오류를주지 않을 것입니다
따라서이 오류는 데이터베이스의 데이터 무결성을 무효화 할 수 있습니다.
전달중인 필드 값이 유효하고 데이터베이스 필드에 따라 확인하십시오. 예를 들어 특정 필드에 전달 된 문자 수가 데이터베이스 테이블 필드에 정의 된 문자보다 적습니다.
당신이 사용하는 경우 IIS를 함께 윈도우위한 인증 및 워크 사용하기주의 authorize
.
나는에 노력 POST
권한 부여 없이이 일을하지 않았고, 그리고 에이 오류가 db.SaveChangesAsync();
다른 모든 동사 동안, GET
그리고 DELETE
일하고 있었다.
그러나 AuthorizeAttribute를 주석으로 추가하면 작동했습니다.
[Authorize]
public async Task<IHttpActionResult> Post(...){
....
}
Not Null
테이블 열에 제약 조건이 있고 삽입 / 업데이트 작업 중에 해당 열의 값을 전달하지 않았 는지 확인합니다 . 이로 인해 발생하는 프레임에서 예외가 발생합니다.
EntityValidationErrors 내부를 찾기 위해 foreach 루프를 사용하는 대신이를 수행하는 또 다른 방법이 있습니다. 물론 원하는대로 메시지 형식을 수 있습니다.
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;
}
나는 또한 같은 문제에 직면했다. 예외가 사라진 후 데이터베이스에서 .edmx를 업데이트했습니다.
이 오류는 주로 필드 크기 때문에 발생합니다. 데이터베이스 테이블의 모든 필드 크기를 확인하십시오.
제 경우에는 데이터베이스 필드의 길이가 입력 필드의 길이보다 작기 때문입니다.
데이터베이스 테이블
create table user(
Username nvarchar(5) not null
);
내 입력
User newUser = new User()
{
Username = "123456"
};
에 대한 값 Username
length
은 5 , 즉 lessthan
6입니다.
... 이것은 누군가를 도울 수 있습니다
'ProgramingTip' 카테고리의 다른 글
Haskell 시작하기 (0) | 2020.09.29 |
---|---|
GitHub 리포지토리에 태그 만들기 (0) | 2020.09.29 |
'이름'또는 'ID'로 HTML 앵커를 소유하고 있습니까? (0) | 2020.09.29 |
@property 데코레이터는 어떻게 작동 작동합니까? (0) | 2020.09.28 |
mock과 stub의 차이점은 무엇입니까? (0) | 2020.09.28 |