2017-06-13 4 views
0

私はC#のプログラミング全体では新しく、ちょっと解けない小さな問題に遭遇しました。テーブルにSaveChangesを書き込もうとしたときの検証エラー

私は以下のコードを中にプログラムされ、それがSaveChangesコールに到達し、それがエラーをスローするまで、それがうまく機能しているソフトウェアを起動:

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

私はすでにEntityValidationErrorsを検査しようと試みてきたが、それはdoesnの何のエラーも私に見せたくありません。だから私はあなたにすべての答えを見つけることを頼んでいます。

// 
// GET: /Installningar/FoxImportTidning 
public async Task<ActionResult> FoxImportTidning() 
{ 
     Tidning tidning = new Tidning(); 
     SaveTidningToDatabase("C:/Backup/Prenback/backuptidning.xls"); 
     return View(); 
} 

// 
// POST: /Installningar/FoxImportTidning 
[HttpPost] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> FoxImportTidning(Tidning Id) 
{ 
     if (ModelState.IsValid) 
     { 
      db.Entry(Id).State = EntityState.Modified; 
      await db.SaveChangesAsync(); 
      Main.PopulateGlobalInst(); 
      ViewBag.SaveMsg = "Sparat!"; 
      return RedirectToAction("Main", "Main", new { Id = Id.Id }); 
     } 

     return View(Id); 
} 

private ApplicationDbContext databas6 = new ApplicationDbContext(); 

private string SaveTidningToDatabase(string filePath) 
{ 
     String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0\"", filePath); 

     using (OleDbConnection excelConnection = new OleDbConnection(excelConnString)) 
     { 
      using (OleDbCommand cmd = new OleDbCommand("Select * from [backuptidning$]", excelConnection)) 
      { 
       excelConnection.Open(); 
       var tidningLista = new List<Tidning>(); 
       databas6.Tidnings.Clear(); 
       databas6.SaveChanges(); 

       using (OleDbDataReader dReader = cmd.ExecuteReader()) 
        do 
        { 
         while (dReader.Read()) 
         { 
          Object[] tidninginfo = new Object[45]; 
          int id = Convert.ToInt32(dReader[0]); 
          string namn = Convert.ToString(dReader[1]); 
          string datadir = Convert.ToString(dReader[2]); 
          string adr1 = Convert.ToString(dReader[3]); 
          string adr2 = Convert.ToString(dReader[4]); 
          string regnr = Convert.ToString(dReader[5]); 
          string tel = Convert.ToString(dReader[6]); 
          string pg = Convert.ToString(dReader[7]); 
          string bg = Convert.ToString(dReader[8]); 
          string villkor = Convert.ToString(dReader[9]); 
          int sista_nr = Convert.ToInt32(dReader[10]); 
          int faktavg = Convert.ToInt32(dReader[11]); 
          int vilande = Convert.ToInt32(dReader[12]); 
          int listlopnr = Convert.ToInt32(dReader[13]); 
          int faktnr = Convert.ToInt32(dReader[14]); 
          decimal moms = Convert.ToDecimal(dReader[15]); 
          int avipriskod = Convert.ToInt32(dReader[16]); 
          DateTime? inbetdat = null; 
          try 
          { 
           inbetdat = Convert.ToDateTime(dReader[17]); 
          } 
          catch { } 

          int period = Convert.ToInt32(dReader[18]); 
          string avityp = Convert.ToString(dReader[19]); 
          DateTime? sistavidat = null; 

          try 
          { 
           sistavidat = Convert.ToDateTime(dReader[20]); 
          } 
          catch { } 

          DateTime? fromdatum = null; 

          try 
          { 
           fromdatum = Convert.ToDateTime(dReader[21]); 
          } 
          catch { } 

          DateTime? tomdatum = null; 

          try 
          { 
           tomdatum = Convert.ToDateTime(dReader[22]); 
          } 
          catch { } 

          int fromprennr = Convert.ToInt32(dReader[23]); 
          int tomprennr = Convert.ToInt32(dReader[24]); 
          string databasversion = Convert.ToString(dReader[25]); 
          int nummerperiod = Convert.ToInt32(dReader[26]); 
          int nolastyear = Convert.ToInt32(dReader[27]); 
          int nonextyear = Convert.ToInt32(dReader[28]); 
          string dubbelnummer = Convert.ToString(dReader[29]); 
          bool skrivetik = Convert.ToBoolean(dReader[30]); 
          bool utrmomsavdrag = Convert.ToBoolean(dReader[31]); 
          bool buntning = Convert.ToBoolean(dReader[32]); 

          int pren = Convert.ToInt32(dReader[33]); 
          int betalare = Convert.ToInt32(dReader[34]); 
          int kredit = Convert.ToInt32(dReader[35]); 
          int fornyanr = Convert.ToInt32(dReader[36]); 

          string landskod = Convert.ToString(dReader[37]); 
          DateTime? nästsist = null; 

          try 
          { 
           nästsist = Convert.ToDateTime(dReader[38]); 
          } 
          catch { } 

          string fax = Convert.ToString(dReader[39]); 
          string epost = Convert.ToString(dReader[40]); 
          string hemsida = Convert.ToString(dReader[41]); 
          string bic = Convert.ToString(dReader[42]); 
          string iban = Convert.ToString(dReader[43]); 
          string faktkoll = Convert.ToString(dReader[44]); 

          var tidning = new Tidning(); 
          tidning.Id = id; 
          tidning.Namn = namn; 
          tidning.Datadir = datadir; 
          tidning.Adr1 = adr1; 
          tidning.Adr2 = adr2; 
          tidning.Regnr = regnr; 
          tidning.Tel = tel; 
          tidning.Pg = pg; 
          tidning.Bg = bg; 
          tidning.Villkor = villkor; 
          tidning.Sista_nr = sista_nr; 
          tidning.FaktAvg = faktavg; 
          tidning.Vilande = vilande; 
          tidning.Listlopnr = listlopnr; 
          tidning.Faktnr = faktnr; 
          tidning.Moms = moms; 
          tidning.AviPriskod = avipriskod; 
          tidning.InbetDatum = inbetdat; 
          tidning.Period = period; 
          tidning.AviTyp = (AviTyp)Enum.Parse(typeof(AviTyp), avityp, true); 
          tidning.SistAviDatum = sistavidat; 
          tidning.FromDatum = fromdatum; 
          tidning.TomDatum = tomdatum; 
          tidning.FromPrennr = fromprennr; 
          tidning.TomPrennr = tomprennr; 
          tidning.Databasversion = databasversion; 
          tidning.Nummerperiod = nummerperiod; 
          tidning.Nolastyear = nolastyear; 
          tidning.Nonextyear = nonextyear; 
          tidning.Dubbelnummer = dubbelnummer; 
          tidning.Skrivetik = skrivetik; 
          tidning.Utrmomsavdrag = utrmomsavdrag; 
          tidning.Buntning = buntning; 
          tidning.Pren = pren; 
          tidning.Betalare = betalare; 
          tidning.Kredit = kredit; 
          tidning.Fornyanr = fornyanr; 
          tidning.Landskod = landskod; 
          tidning.NastSist = nästsist; 
          tidning.Fax = fax; 
          tidning.Epost = epost; 
          tidning.Hemsida = hemsida; 
          tidning.Bic = bic; 
          tidning.Iban = iban; 
          tidning.Faktkoll = faktkoll; 

          tidningLista.Add(tidning); 
         } 
        } while (dReader.NextResult()); 
       databas6.Tidnings.AddRange(tidningLista); 
       databas6.SaveChanges(); //<--- This is where it goes wrong 
       excelConnection.Close(); 

       return ("hej"); //<--- Do not mind this one 
      } 
     } 
} 

さらに詳しい情報が必要な場合は、私に連絡してください。私が欲しい主なことは、これを働かせることです。これが私にこの問題を与える唯一のコードではありませんが、もしこの問題が解決できれば、他の問題も同じように解決できます。

+1

はのtry/catchであなたのSaveChangesを包みます。それが失敗すると、例外を掘り下げて検証エラーの原因を正確に調べることができます。 – garethb

+0

あなたは 'select *'を使っていますので、 'dReader'が正しい順序で列を読み込むようにしなければなりません。その順序を二重/三重にチェックしましたか?また、 'Object [] tidninginfo = new Object [45];は使用されていません。 – Rafalon

+0

[検証が1つ以上のエンティティで失敗した可能性があります。詳細については、 'EntityValidationErrors'プロパティを参照してください。(https://stackoverflow.com/questions/7795300/validation-failed-for-one-or-more-entities-see-entityvalidationerrors-propert) – mmushtaq

答えて

0

このエラーは、無効なデータをデータベーステーブルに追加しようとしている場合に発生します。

表の列に100文字の文字列を追加していますが、表の定義では、列の最大長は50です。この場合、追加する値は列定義ごとに無効であり、このエラーが発生します。

エラーの原因となっているプロパティを記録する必要があります。あなたは多くのコードを記述せず、ウォッチウィンドウを使用して、簡単にこれらのエラーをキャッチすることができ

catch (System.Data.Entity.Validation.DbEntityValidationException ex) 
      { 
       Logger.WriteError("{0}{1}Validation errors:{1}{2}", ex, Environment.NewLine, ex.EntityValidationErrors.Select(e => string.Join(Environment.NewLine, e.ValidationErrors.Select(v => string.Format("{0} - {1}", v.PropertyName, v.ErrorMessage))))); 
       throw; 
      } 
0

:そのためにあなたは、コードの下に使用することができます。

親切に私は本当に答えは非常に良いスクリーンショットで、与えられたような方法でインスピレーションを次のリンク

https://stackoverflow.com/a/40732784/3397630

で非常に良い解決策を見つけます。それをあなたと他の人に役立つだろうという希望でここで共有する。

おかげ

カルティク

関連する問題