// --- атрибуты ----------------------------------------------------------------------------
 public ActionResult Attrs(int tableID, string tableName)
 {
     using (AttrContext db = new AttrContext("cs_xam"))
     {
         var attrs = (from a in db.Attrs where a.table_id == tableID select a).ToList<Attr>();
         ViewBag.tableID = tableID;
         ViewBag.tableName = tableName;
         return PartialView( "_Attrs", attrs);
     }
 }
        public ActionResult CreateAttr(Attr model, long tableID, string tableName)
        {
            ViewBag.tableID = tableID;
            ViewBag.tableName = tableName;

            using (AttrContext db = new AttrContext("cs_xam"))
            {
                if (ModelState.IsValid)
                {
                    // нет длины
                    if (model.length == null && model.length_fn == null)
                    {
                        ModelState.AddModelError("Ошибка", "Должна быть указана точная длина значения или её НЧ.");
                        return View(model);
                    }
                    // и точное, и НЧ
                    if (model.length != null && model.length_fn != null)
                    {
                        ModelState.AddModelError("Ошибка", "Должна быть указана или точная длина значения, или её НЧ, но не оба значения сразу.");
                        return View(model);
                    }
                    // проверка НЧ длины по формату
                    if (!string.IsNullOrEmpty(model.length_fn) && !Regex.Match(model.length_fn, @"^\d+;\d+;\d+;\d+$").Success)
                    {
                        ModelState.AddModelError("Ошибка", "Нечёткое число длины должно быть в формате \"d;d;d;d\", где \"d\" - это целое число. Например: 4;6;9;12");
                        return View(model);
                    }

                    // нет мощности
                    if (model.power == null && model.power_fn == null)
                    {
                        ModelState.AddModelError("Ошибка", "Должно быть указано точное значение мощности или его НЧ.");
                        return View(model);
                    }
                    // и точное, и НЧ
                    if (model.power != null && model.power_fn != null)
                    {
                        ModelState.AddModelError("Ошибка", "Должно быть указано или точное значение мощности, или его НЧ, но не оба значения сразу.");
                        return View(model);
                    }
                    // проверка НЧ длины по формату
                    if (!string.IsNullOrEmpty(model.power_fn) && !Regex.Match(model.power_fn, @"^\d+;\d+;\d+;\d+$").Success)
                    {
                        ModelState.AddModelError("Ошибка", "Нечёткое число мощности должно быть в формате \"d;d;d;d\", где \"d\" - это целое число. Например: 4;6;9;12");
                        return View(model);
                    }

                    model.table_id = tableID;
                    db.Attrs.Add(model);
                    db.SaveChanges();

                    //logger.Info(string.Format("Создан атрибут [{0}]", model.id_attr));

                    return RedirectToAction("Index");
                }
                else
                {
                    return View(model);
                }
            }
        }
        public ActionResult EditAttr(Attr model)
        {
            using (AttrContext db = new AttrContext("cs_xam"))
            {
                if (db.Attrs.Any(a => a.id_attr == model.id_attr))
                {
                    if (ModelState.IsValid)
                    {
                        // нет длины
                        if (model.length == null && model.length_fn == null)
                        {
                            ModelState.AddModelError("Ошибка", "Должна быть указана точная длина значения или её НЧ.");
                            return View(model);
                        }
                        // и точное, и НЧ
                        if (model.length != null && model.length_fn != null)
                        {
                            ModelState.AddModelError("Ошибка", "Должна быть указана или точная длина значения, или её НЧ, но не оба значения сразу.");
                            return View(model);
                        }
                        // проверка НЧ длины по формату
                        if (!string.IsNullOrEmpty(model.length_fn) && !Regex.Match(model.length_fn, @"^\d+;\d+;\d+;\d+$").Success)
                        {
                            ModelState.AddModelError("Ошибка", "Нечёткое число длины должно быть в формате \"d;d;d;d\", где \"d\" - это целое число. Например: 4;6;9;12");
                            return View(model);
                        }

                        // нет мощности
                        if (model.power == null && model.power_fn == null)
                        {
                            ModelState.AddModelError("Ошибка", "Должно быть указано точное значение мощности или его НЧ.");
                            return View(model);
                        }
                        // и точное, и НЧ
                        if (model.power != null && model.power_fn != null)
                        {
                            ModelState.AddModelError("Ошибка", "Должно быть указано или точное значение мощности, или его НЧ, но не оба значения сразу.");
                            return View(model);
                        }
                        // проверка НЧ длины по формату
                        if (!string.IsNullOrEmpty(model.power_fn) && !Regex.Match(model.power_fn, @"^\d+;\d+;\d+;\d+$").Success)
                        {
                            ModelState.AddModelError("Ошибка", "Нечёткое число мощности должно быть в формате \"d;d;d;d\", где \"d\" - это целое число. Например: 4;6;9;12");
                            return View(model);
                        }

                        db.Entry(model).State = EntityState.Modified;
                        db.SaveChanges();

                        //logger.Info(string.Format("Изменён атрибут [{0}]", model.id_attr));

                        return RedirectToAction("Index");
                    }
                    else
                    {
                        return View(model);
                    }
                }
                else
                {
                    ModelState.AddModelError("Ошибка", "В вашей таблице нет такого атрибута.");
                    return View(model);
                }
            }
        }
 public ActionResult EditAttr(long id, long tableID)
 {
     using (AttrContext db = new AttrContext("cs_xam"))
     {
         if (db.Attrs.Any(a => a.id_attr == id && a.table_id == tableID))
         {
             var attr = (from a in db.Attrs where a.id_attr == id select a).First();
             return View(attr);
         }
         else
         {
             ModelState.AddModelError("Ошибка", "В этой таблице нет такого атрибута.");
             return RedirectToAction("Index");
         }
     }
 }
        public ActionResult DeleteAttr(int id, long tableID)
        {
            try
            {
                using (AttrContext db = new AttrContext("cs_xam"))
                {
                    if (db.Attrs.Any(a => a.id_attr == id && a.table_id == tableID))
                    {
                        var attr = (from a in db.Attrs where a.id_attr == id select a).First();
                        db.Attrs.Remove(attr);
                        db.SaveChanges();

                        //logger.Info(string.Format("Удалён атрибут [{0}]", id));
                    }
                    else
                    {
                        throw new Exception("В этой таблице нет такого атрибута");
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error(string.Format("Не удалось удалить атрибут [{0}]. {1}", id, ex.Message));
                ModelState.AddModelError("Ошибка", string.Format("Не удалось удалить атрибут. {0}", ex.Message));
            }

            //TableContext dbTables = new TableContext("cs_xam");
            //var userTables = (from t in dbTables.Tables where t.scenario_id == scenarioID select t);
            //return View("Index", userTables);
            return RedirectToAction("Index");
        }