it-swarm-id.com

Validasi gagal untuk satu entitas atau lebih. Lihat properti 'EntityValidationErrors' untuk detail lebih lanjut

Saya mengalami kesalahan ini saat menyemai database saya dengan pendekatan kode pertama.

Validasi gagal untuk satu entitas atau lebih. Lihat properti 'EntityValidationErrors' untuk detail lebih lanjut.

Sejujurnya saya tidak tahu bagaimana memeriksa konten kesalahan validasi. Visual Studio menunjukkan kepada saya bahwa itu adalah array dengan 8 objek, jadi 8 kesalahan validasi.

Ini bekerja dengan model saya sebelumnya, tetapi saya membuat beberapa perubahan yang saya jelaskan di bawah:

  • Saya memiliki enum bernama Status, saya mengubahnya ke kelas yang disebut Status
  • Saya mengubah kelas ApplicantsPositionHistory untuk memiliki 2 kunci asing ke tabel yang sama

Maafkan saya untuk kode yang panjang, tapi saya harus menempel semuanya. Pengecualian dilemparkan di baris terakhir dari kode berikut.

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
        }
    }
}
710
Luis Valencia

Sejujurnya saya tidak tahu bagaimana memeriksa konten kesalahan validasi. Visual Studio menunjukkan kepada saya bahwa itu adalah array dengan 8 objek, jadi 8 kesalahan validasi.

Sebenarnya Anda akan melihat kesalahan jika Anda menelusuri array di Visual studio selama debug. Tetapi Anda juga dapat menangkap pengecualian dan kemudian menulis kesalahan ke beberapa toko logging atau konsol:

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 adalah koleksi yang mewakili entitas yang tidak dapat divalidasi dengan sukses, dan koleksi dalam ValidationErrors per entitas adalah daftar kesalahan di tingkat properti.

Pesan validasi ini biasanya cukup membantu untuk menemukan sumber masalahnya. 

Edit

Beberapa perbaikan kecil:

Value dari properti yang menyinggung dapat dimasukkan dalam loop dalam seperti:

        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);
        }

Walaupun debugging Debug.Write mungkin lebih disukai daripada Console.WriteLine karena ia bekerja di semua jenis aplikasi, tidak hanya aplikasi konsol (terima kasih kepada @Bart untuk catatannya dalam komentar di bawah).

Untuk aplikasi web yang sedang dalam produksi dan yang menggunakan Elmah untuk penebangan pengecualian, ternyata sangat berguna bagi saya untuk membuat pengecualian khusus dan menimpa SaveChanges untuk membuang pengecualian baru ini.

Jenis pengecualian khusus terlihat seperti ini:

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;
        }
    }
}

Dan SaveChanges dapat ditimpa dengan cara berikut:

public class MyContext : DbContext
{
    // ...

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

Beberapa komentar:

  • Layar kesalahan kuning yang ditampilkan Elmah di antarmuka web atau email yang terkirim (jika sudah dikonfigurasi) sekarang menampilkan detail validasi langsung di bagian atas pesan.

  • Menimpa properti Message dalam pengecualian khusus alih-alih menimpa ToString() memiliki manfaat bahwa ASP.NET standar "Layar kuning kematian (YSOD)" juga menampilkan pesan ini. Berbeda dengan Elmah, YSOD tampaknya tidak menggunakan ToString(), tetapi keduanya menampilkan properti Message.

  • Membungkus DbEntityValidationException asli sebagai pengecualian dalam memastikan bahwa jejak tumpukan asli masih akan tersedia dan ditampilkan dalam Elmah dan YSOD.

  • Dengan menetapkan breakpoint pada baris throw newException; Anda cukup memeriksa properti newException.Message sebagai teks alih-alih menelusuri koleksi validasi yang agak canggung dan sepertinya tidak bekerja dengan mudah untuk semua orang (lihat komentar di bawah).

1127
Slauma

Anda dapat melakukannya dari Visual Studio selama debugging tanpa menulis kode apa pun, bahkan tidak menangkap blok.

Cukup tambahkan arloji dengan nama:

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

Ekspresi arloji $exception menampilkan pengecualian yang dilemparkan dalam konteks saat ini, bahkan jika belum ditangkap dan ditugaskan ke variabel.

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

410
yoel halb

Ini sebenarnya dapat melakukannya tanpa harus menulis kode: 

Di blok tangkap Anda, tambahkan break point di baris kode berikut:

catch (Exception exception)
{

}

Sekarang jika Anda mengarahkan pada exception atau menambahkannya ke Watch dan kemudian menavigasi ke detail pengecualian seperti yang ditunjukkan di bawah ini; Anda akan melihat kolom mana yang menyebabkan masalah karena kesalahan ini biasanya terjadi ketika kendala tabel dilanggar ..

enter image description here

Gambar besar

88
t_plusplus

Inilah cara Anda dapat memeriksa konten EntityValidationErrors di Visual Studio (tanpa menulis kode tambahan) mis. Selama Debugging dalam IDE.

Masalah?

Anda benar, popup debugger Visual Studio Lihat Detail tidak menampilkan kesalahan aktual di dalam koleksi EntityValidationErrors

 enter image description here

Solusinya!

Cukup tambahkan ekspresi berikut di jendela Tonton Cepat dan klik Evaluasi ulang.

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

Dalam kasus saya, lihat bagaimana saya dapat memperluas ke ValidationErrorsList di dalam koleksi EntityValidationErrors 

 enter image description here

Referensi:posting blog mattrandle.me , @ yoel's jawaban

42
Shiva

Untuk cara cepat melihat kesalahan pertama tanpa menambahkan arloji Anda dapat menempel ini di Jendela Segera:

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

Bagi siapa saja yang bekerja di 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
14
nghiavt

Saat Anda dalam mode debug di dalam blok catch {...} buka jendela "QuickWatch" (ctrl+alt+q) dan tempel di sana:

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

atau:

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

Jika Anda tidak mencoba/menangkap atau tidak memiliki akses ke objek pengecualian.

Ini akan memungkinkan Anda untuk menelusuri pohon ValidationErrors. Ini cara termudah yang saya temukan untuk mendapatkan wawasan instan tentang kesalahan ini.

11
GONeale

Jika Anda hanya menangkap pengecualian umum, mungkin bermanfaat bagi Anda untuk melemparkan ini sebagai DbEntityValidationException . Jenis pengecualian ini memiliki properti Kesalahan Validasi, dan terus memperluas jalan Anda ke dalamnya, Anda akan menemukan semua masalah.

Misalnya, jika Anda memasukkan break point ke dalam tangkapan, Anda bisa melempar yang berikut ke arloji:

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

Contoh kesalahan adalah jika bidang tidak mengizinkan nol, dan Anda memiliki string nol, Anda akan melihatnya mengatakan bahwa bidang tersebut wajib diisi.

10
Greg

Dalam debug, Anda bisa memasukkan ini di bidang entri evaluator ekspresi QuickWatch Anda:

context.GetValidationErrors()
9
silverfox1948

cukup Periksa Panjang Tabel Tabel Database Anda. Teks Input Anda Lebih Besar dari panjang kolom tipe data kolom panjang

8
Hardeep Singh

Saya harus menulis ini di jendela Segera: 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]

untuk mengetahui kesalahan yang sebenarnya!

7
Nour Sabouny

Jawaban Per @ Slauma dan saran @ Milton Saya telah memperluas metode penyimpanan kustom kelas dasar kami dengan try/catch yang akan menangani (dan karenanya login kesalahan log kami!) Semacam pengecualian ini.

// 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);
    }
}
6
jocull

Perhatikan bahwa Entity.GetType().BaseType.Name memberikan nama tipe yang Anda tentukan, bukan nama dengan semua digit hex dalam namanya.

6
Eric Nelson

Dengan menggunakan jawaban @Slauma, saya telah membuat cuplikan kode (surround dengan cuplikan) untuk penggunaan yang lebih baik.

<?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>
6
Phoenix_uy

Tangkap pengecualian dalam try catch dan kemudian tonton cepat atau ctrl + d & ctrl + q dan Anda bisa menelusuri EntityValidationErrors.

5
Brandon.Staley

Apa yang saya temukan ... ketika saya mendapatkan kesalahan 'EntityValidationErrors' adalah bahwa .... saya memiliki bidang dalam database saya 'db1' dalam tabel 'tbladdress' sebagai 'address1' yang memiliki ukuran 100 (yaitu alamat varchar (100) null) dan saya memberikan nilai lebih dari 100 karakter..dan ini menyebabkan kesalahan saat menyimpan data ke basis data ....

Jadi, Anda harus Periksa data yang Anda berikan ke bidang.

4

Hanya melempar dua sen saya ke ...

Di dalam dbConfiguration.cs saya, saya ingin membungkus metode context.SaveChanges () saya menjadi try/catch dan menghasilkan file teks keluaran yang memungkinkan saya untuk membaca Kesalahan dengan jelas, dan kode ini juga mencatat waktu mereka - berguna jika Anda mengalami lebih dari satu kesalahan pada waktu yang berbeda!

        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;
        }
4
IfElseTryCatch

Seperti disebutkan dalam posting lain, cukup tangkap pengecualian di kelas DbEntityValidationException . Yang akan memberi Anda apa pun yang Anda butuhkan selama kasus kesalahan.

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

Ini bekerja untuk saya.

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

Letakkan breakpoint pada if statement . Kemudian Anda dapat memeriksa modelState di jendela debug. Pada setiap nilai Anda dapat melihat apakah ada kesalahan dan bahkan pesan kesalahan. Itu saja . Ketika Anda tidak membutuhkannya lagi, cukup hapus atau komentari barisnya.

Saya harap ini akan membantu.

Jika ditanya, saya dapat memberikan tangkapan layar terperinci di jendela debug.

3
AngelDown

Saya menghadapi kesalahan ini sebelumnya 

ketika saya mencoba memperbarui bidang tertentu dalam model saya di entitas framwork

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;
    }

dan sesuai jawaban di atas 

Saya menemukan pesan Validasi The SignerName field is required.

yang menunjuk ke bidang dalam model saya 

dan ketika saya memeriksa skema database saya, saya menemukan 

 enter image description here

jadi off coure ValidationException memiliki hak untuk menaikkan 

dan menurut bidang ini saya ingin nullable, (Saya tidak tahu bagaimana saya mengacaukannya)

jadi saya mengubah bidang itu untuk memungkinkan Null, dan dengan ini kode saya tidak akan memberi saya kesalahan ini lagi 

jadi kesalahan ini mungkin akan terjadi jika Anda membatalkan integritas data Anda dari database Anda 

2

Silakan periksa nilai bidang yang Anda lewati, apakah valid dan sesuai dengan bidang basis data. Misalnya jumlah karakter yang diteruskan dalam bidang tertentu kurang dari karakter yang ditentukan dalam bidang tabel database.

2
arun tiwari

Jika Anda menggunakanIISdengan Otentikasi Windows dan Kerangka Entitas , berhati-hatilah untuk menggunakan authorize.

Saya mencoba POST tanpa otorisasi dan tidak berhasil, dan mendapatkan kesalahan ini pada db.SaveChangesAsync();, sementara semua kata kerja lainnya GET dan DELETE bekerja.

Tetapi ketika saya menambahkan AuthorizeAttribute sebagai anotasi, itu berhasil.

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

Periksa apakah Anda memiliki batasan Not Null di kolom tabel Anda dan Anda tidak melewati nilai untuk kolom tersebut saat memasukkan/Perbarui operasi . Itu yang menyebabkan pengecualian ini dalam kerangka entitas.

0
s Jagathish

Saya juga menghadapi masalah yang sama. Saya memperbarui .edmx saya dari database setelah itu pengecualian telah hilang 

0
HariChintha

Berikut cara lain untuk melakukannya daripada menggunakan foreach loop untuk mencari di dalam EntityValidationErrors. Tentu saja Anda dapat memformat pesan sesuai keinginan Anda:

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;
    }
0
Quantum_Joe

Dalam kasus saya itu karena panjang bidang database kurang dari panjang bidang input.

tabel database

create table user(
  Username nvarchar(5) not  null
);

Input saya

User newUser = new User()
{
   Username = "123456"
};

nilai untuk Usernamelength adalah 5 yang lessthan 6

... ini dapat membantu seseorang

0
Qwerty

Kesalahan ini terjadi terutama karena ukuran bidang . Periksa semua ukuran bidang dalam tabel database.

0