0

我在 CMS 中有一个基本的 CRUD,使用 EF 并且首先使用数据库完成,删除功能只是从数据库中删除记录。

以下是删除的控制器代码:

 public ActionResult Delete(int id)
    {
        Database_Table database_table = db.Database_Table.Find(id);
        return View(database_table);
    }


    [HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {            
        Database_Table database_table = db.Database_Table.Find(id);
        db.Database_Table.Remove(database_table);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

现在从客户的角度来看,出于安全原因,我不想实际从数据库表中删除条目,我只想更改数据库中的一个值,即“已删除,从“N”到“Y”,然后我将隐藏它,则不会通过自定义查询显示值为“Y”的条目。如果这是有道理的。我的问题是如何更改此代码以不删除,而只是更改该值。

我觉得它看起来像:

[HttpPost, ActionName("Delete")]
    public ActionResult DeleteConfirmed(int id)
    {
        if (ModelState.IsValid)
        {

        Database_Name database_name = db.Database_Name.Find(id);
        db.Entry(database_name).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
        }
            return View(database_table);
    }

但我不确定在哪里定义它只有一个将被修改的值,在这种情况下是“已删除”值。也许还说它应该只返回视图一个值为“N”的条目

4

2 回答 2

0

这应该是条件映射的一个用例。条件映射将自动从所有查询中过滤您已删除的项目:

  • 您的 Linq 查询
  • 渴望加载
  • 延迟加载

没有其他可靠的方法可以从预先加载和延迟加载的数据中过滤软删除记录。

但是条件映射也有它的缺点:

  • Deleted属性不能是实体的一部分,因为它已用于条件映射(您将永远无法使用此模型查询已删除的记录)
  • 删除操作必须映射到存储过程(或自定义 SQL,但需要在 EDMX 中手动更改),这将为您执行软删除,因为您无权访问Deleted代码中的属性
  • 要使其功能齐全,您需要使用 EDMX,因为 code first 尚不支持存储过程映射
于 2012-08-30T20:55:00.853 回答
0

试试这个代码。我建议您将此类代码移动到不同层中的方法(您可以创建一个新类以在其中拥有此方法并从您的控制器操作/任何您想要的地方调用它。

Database_Name database_name = db.Database_Name.Find(id);

database_name.Deleted="Y";
db.Database_Name.Attach(database_name);
db.Entry(database_name).State = EntityState.Modified;
try
{        
   db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
    ex.Entries.Single().Reload();
    context.SaveChanges();        
}
catch (Exception ex2)
{
    //some error. Log it 
}
于 2012-08-30T15:11:01.277 回答