2017-06-13 117 views
0

我对C#的整个编程颇为陌生,而我偶然发现了一个我无法解决的小问题。尝试将SaveChanges更改为表时出现验证错误

我启动软件下面的代码被编入,它运作良好,直到它到达SaveChanges呼叫,它抛出一个错误:

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

我已经尝试检查EntityValidationErrors,但它不我不想让我看到任何错误。所以我正在向你们所有人寻求一些答案。

// 
// 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

包装你的SaveChanges在一个try/catch。当它失败时,您应该能够深入了解异常并确切地查看导致验证错误的内容。 – garethb

+0

您正在使用'select *',所以您必须确保您的'dReader'以正确的顺序读取列,您是否将这个顺序翻两番或三倍?另外'对象[] tidninginfo =新对象[45];'是未使用的,这是正常的吗? – Rafalon

+0

[可能有一个或多个实体的验证失败。请参阅'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

我真的启发给出这个问题的答案的方式,具有很好的截图很好的解决方案。在这里分享,希望对你和其他人有所帮助。

感谢

KARTHIK

相关问题