尝试将ChangeChanges保存到表

时间:2017-06-13 06:31:54

标签: c# asp.net-mvc razor visual-studio-2015

我对C#的整个编程比较陌生,我偶然发现了一个我无法解决的小问题。

我启动了以下代码编程的软件,它运行良好,直到达到SaveChanges调用并且它会抛出错误:

  

一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。

我已经尝试检查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
            }
        }
}

如果您需要任何进一步的信息,请告诉我,我会提供。我想要的主要是使这个工作,这不是唯一给我这个问题的代码,但如果这个问题可以解决,那么其他的可能会以同样的方式解决。

2 个答案:

答案 0 :(得分:0)

当您尝试将无效数据添加到数据库表时,会导致此错误。

e.g。您正在向表列添加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;
            }

答案 1 :(得分:0)

您可以使用监视窗口轻松捕获这些错误,而无需编写太多代码。

请在以下链接中找到非常好的解决方案

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

我的答案得到了很好的启发,非常好的截图。在这里分享,希望它对您和其他人有所帮助。

感谢

KARTHIK