我想在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
答案 0 :(得分:2)
您是否希望存在重复数据?
如果表从不对于相同的SectionName和StoreName值包含多于1行,那么您应该在数据库中通过在这2列上创建复合主键(聚簇索引)来解决此问题,或在这两列上创建唯一的非聚集索引。
然后在您的.NET MVC中,您还可以在插入数据时执行一些检查以检查它是否已经存在,但您不会严格拥有,并且您的数据库仍然无法执行进入一个糟糕的状态。
答案 1 :(得分:2)
我会回应一些已经说过的内容并添加一些想法。
首先:在数据库级别有一个约束,可以完全阻止重复的场景。这通常使用密钥完成,某些类型的索引也可以强制执行此约束。
第二:在向数据库添加必须唯一的任何内容之前,从数据库中要求提供对象的副本,如果这些参数存在,只需更新记录,如果他们没有不要添加新项目。
第三:如果这是一个必须在任何情况下都不能重复的关键项目,请确保第二步发出锁定,以便其他人无法对该密钥执行任何操作。锁定将确保当您搜索该项目时,其他任何人都无法在您执行此操作后添加该项目。
在我自己的系统中,我使用SQL级别锁和基于Cache的分布式锁的组合。无论哪种方式,如果它是一个关键组件,您将希望开始更好地理解这种架构。在大多数非关键的低负载情况下,您可以通过简单的查找来逃避。