私のデータベースにコードファーストアプローチでシードするとき、私はこのエラーを抱えています。
1つ以上のエンティティの検証に失敗しました。詳細については、 'EntityValidationErrors'プロパティを参照してください。
正直に言うと、検証エラーの内容を確認する方法がわかりません。 Visual Studioはそれが8つのオブジェクトを持つ配列であることを私に示しているので、8つの検証エラーです。
これは以前のモデルでも機能していましたが、以下に説明するいくつかの変更を加えました。
長いコードですみませんが、全部貼り付ける必要があります。次のコードの最後の行に例外がスローされます。
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つのオブジェクトを持つ配列であることを私に示しているので、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
は、プロパティレベルでのエラーのリストです。
これらの検証メッセージは通常、問題の原因を突き止めるのに十分役立ちます。
編集
若干の改善点
違反しているプロパティの value は、次のように内側のループに含めることができます。
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 を使用するWebアプリケーションの場合、カスタム例外を作成してこの新しい例外をスローするためにSaveChanges
を上書きすることは非常に便利です。
カスタム例外タイプは次のようになります。
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がWebインターフェースまたは送信されたEメール(あなたがそれを設定しているなら)に表示する黄色いエラースクリーンは、メッセージの一番上に直接検証の詳細を表示します。
ToString()
を上書きするのではなく、カスタム例外でMessage
プロパティを上書きすると、標準の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
に追加して、次に示すように例外の詳細に移動します。このエラーは通常table-constraintに違反したときに発生するため、どの特定の列が問題を引き起こしているのかがわかります。
Visual StudioでEntityValidationErrorsの内容を確認する方法を次に示します(余分なコードを記述することなく)。つまりIDEでDebuggingを実行します。
そうです、Visual StudioデバッガーのView Details PopupはEntityValidationErrors
コレクション内の実際のエラーを表示しません。
Quick Watchウィンドウに次の式を追加して、Reevaluateをクリックします。
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
私の場合、ValidationErrors
コレクション内のList
EntityValidationErrors
に展開する方法を参照してください
ウォッチを追加せずに最初のエラーを確認する簡単な方法として、イミディエイトウィンドウにこれを貼り付けることができます。
((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 {...}
ブロック内でデバッグモードに入っている間、 "QuickWatch"ウィンドウを開きます(ctrl+alt+q)を貼り付けます。
((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors
または:
((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
Try/catchしていない場合、または例外オブジェクトにアクセスできない場合。
これにより、ValidationErrors
ツリーにドリルダウンできます。それは私がこれらのエラーに対する即時の洞察を得るために私が見つけた最も簡単な方法です。
単に一般的な例外をキャッチするだけの場合は、これをDbEntityValidationExceptionとしてキャストすると便利です。この種の例外にはValidation Errorsプロパティがあり、それをさらに拡大し続けると、すべての問題が発生します。
たとえば、キャッチにブレークポイントを設定した場合は、次のコードをウォッチに追加できます。
((System.Data.Entity.Validation.DbEntityValidationException ) ex)
エラーの例はです。フィールドがnullを許可せず、null文字列を持っている場合、そのフィールドは必須であると言われます。
デバッグでは、これをQuickWatch式エバリュエータの入力フィールドに入力できます。
context.GetValidationErrors()
データベーステーブルのフィールド長を確認するだけです。 入力テキストが列フィールドのデータ型の長さを超えています
私はこれをイミディエイトウィンドウに書く必要がありました: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]
正確なエラーを深く理解するために!
@ Slaumaさんの回答と@ Miltonさんの提案私はこのような例外を処理する(したがってエラーログに記録する)try/catchを使用して基本クラスのカスタムsaveメソッドを拡張しました。
// 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からの答えは本当に素晴らしいのですが、ComplexTypeプロパティが無効な場合にはうまくいかないことがわかりました。
たとえば、複合型Phone
のプロパティPhoneNumber
があるとします。 AreaCode
プロパティが無効な場合、ve.PropertyNames
のプロパティ名は "Phone.AreaCode"です。これにより、eve.Entry.CurrentValues<object>(ve.PropertyName)
の呼び出しは失敗します。
これを修正するには、それぞれの.
でプロパティ名を分割してから、結果として得られるプロパティ名の配列を再帰します。最後に、チェーンの一番下に到達したら、単純にプロパティの値を返すことができます。
以下はComplexTypeをサポートする@ SlaumaのFormattedDbEntityValidationException
クラスです。
楽しい!
[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の答えを使って、私はより良い使用のためにコードスニペット(スニペットで囲む)を作りました。
<?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>
Try catchしてからクイックウォッチまたはctrl + d&ctrl + qで例外をキャッチすると、EntityValidationErrorsにドリルダウンできます。
'EntityValidationErrors'エラーが発生したときに検出されたものです。テーブル 'tbladdress'のデータベース 'db1'に 'address1'として100のサイズのフィールドがあります(すなわち、アドレスvarchar(100))。 null)そして、私は100文字以上の値を渡していました。
だからあなたはフィールドに渡しているデータを確認する必要があります。
ちょうど私の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;
}
他の記事で述べたように、DbEntityValidationExceptionクラスの例外をキャッチするだけです。
try
{
....
}
catch(DbEntityValidationException ex)
{
....
}
これは私のために働きます。
var modelState = ModelState.Values;
if (!ModelState.IsValid)
{
return RedirectToAction("Index", "Home", model);
}
If文にブレークポイントを設定します。その後、デバッグウィンドウでmodelStateを確認できます。すべての値について、エラーがあるかどうか、さらにはエラーメッセージがあるかどうかを確認できます。 必要でなくなったら、その行を削除またはコメントするだけです。
これが役立つことを願っています。
尋ねられたら、私は詳細なスクリーンショットをデバッグウィンドウに提供することができます。
私は前にこのエラーに直面しました
エンティティフレームワークのモデルの特定のフィールドを更新しようとしたとき
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.
が見つかりました
これは私のモデルのフィールドを指しています
データベーススキーマを確認したところ
そのため、coure ValidationException
は昇給する権利を持ちます。
そしてこの分野によれば、私はそれをnull許容値にしたいのです。
だから私はNullを許可するようにそのフィールドを変更し、これによって私のコードは再び私にこのエラーを与えない
あなたのデータベースのあなたのデータの整合性を無効にすると、このエラーが起こる可能性があります
渡しているフィールドの値が正しいかどうか、データベースのフィールドに従って確認してください。たとえば、特定のフィールドに渡された文字数が、データベーステーブルフィールドに定義された文字数より少ないです。
_ iis _ を Windows Authentification および Entity Framework と共に使用している場合は、authorize
を使用するように注意してください。
他の動詞POST
とGET
は動いていましたが、私は許可なしにDELETE
を試みましたが、動かず、db.SaveChangesAsync();
でこのエラーが出ました。
しかし、私がアノテーションとしてAuthorizeAttributeを追加したとき、それはうまくいきました。
[Authorize]
public async Task<IHttpActionResult> Post(...){
....
}
テーブルの列にNot Null
制約があり、挿入/更新操作中にその列の値が渡されないかどうかを確認してください。
私も同じ問題に直面しました。例外が消えた後、データベースから.edmxを更新しました。
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;
}
私の場合は、データベースフィールドの長さが入力フィールドの長さより短いためです。
データベーステーブル
create table user(
Username nvarchar(5) not null
);
私の入力
User newUser = new User()
{
Username = "123456"
};
Username
length
の値は 5 ですlessthan
6
...これは誰かに役立つかもしれません
このエラーは主にフィールドサイズが原因で発生します。データベーステーブル内のすべてのフィールドサイズを確認してください。