防止用户将重复数据发布到数据库中

时间:2015-05-20 19:12:00

标签: c# asp.net asp.net-mvc crud

我想在Asp.net MVC项目中实现对创建重复数据的限制。

我有一个表tSectionForwardSelling(SectionForwardSellingID,StoreID,SectionID,Amount,Date)。

如果他想在tSectionForwardSelling中输入的数据已经具有相同的StoreID和SectionID,我想限制用户输入重复数据。如果存在具有相同StoreID和SectionID的数据,则他只能编辑。

我想避免这种情况:

    Amount    Date       SectionName     StoreName 

    $1000   5/20/2015        Men          Clarissa 
    $2345   5/20/2015        Men          Clarissa

这是来自tSectionForwardSellings控制器的Create ActionResult:

// GET: tSectionForwardSellings/Create
public ActionResult Create()
{
    ViewBag.SectionID = new SelectList(db.tSections, "SectionID", "Section_Name");
    ViewBag.StoreID = new SelectList(db.tStores, "StoreID", "Store_Name");
    return View();
}

// POST: tSectionForwardSellings/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "SectionForwardSellingID,Amount,Date,StoreID,SectionID")] tSectionForwardSelling tSectionForwardSelling)
{
    if (ModelState.IsValid)
    {
        db.tSectionForwardSellings.Add(tSectionForwardSelling);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.SectionID = new SelectList(db.tSections, "SectionID", "Section_Name", tSectionForwardSelling.SectionID);
    ViewBag.StoreID = new SelectList(db.tStores, "StoreID", "Store_Name", tSectionForwardSelling.StoreID);
    return View(tSectionForwardSelling);
}

这里的项目本身: https://drive.google.com/file/d/0BwgF9RnNTDDEOVlUMmxub2JxbFU/view?usp=sharing

2 个答案:

答案 0 :(得分:2)

您是否希望存在重复数据?

如果表从不对于相同的SectionName和StoreName值包含多于1行,那么您应该在数据库中通过在这2列上创建复合主键(聚簇索引)来解决此问题,或在这两列上创建唯一的非聚集索引。

然后在您的.NET MVC中,您还可以在插入数据时执行一些检查以检查它是否已经存在,但您不会严格拥有,并且您的数据库仍然无法执行进入一个糟糕的状态。

答案 1 :(得分:2)

我会回应一些已经说过的内容并添加一些想法。

首先:在数据库级别有一个约束,可以完全阻止重复的场景。这通常使用密钥完成,某些类型的索引也可以强制执行此约束。

第二:在向数据库添加必须唯一的任何内容之前,从数据库中要求提供对象的副本,如果这些参数存在,只需更新记录,如果他们没有不要添加新项目。

第三:如果这是一个必须在任何情况下都不能重复的关键项目,请确保第二步发出锁定,以便其他人无法对该密钥执行任何操作。锁定将确保当您搜索该项目时,其他任何人都无法在您执行此操作后添加该项目。

在我自己的系统中,我使用SQL级别锁和基于Cache的分布式锁的组合。无论哪种方式,如果它是一个关键组件,您将希望开始更好地理解这种架构。在大多数非关键的低负载情况下,您可以通过简单的查找来逃避。