实体框架代码首先自定义CRUD操作

时间:2013-06-05 06:55:57

标签: asp.net-mvc entity-framework-5

我正在使用现有数据库进行EF Code First Approach。方案如下:

  1. 每当我插入数据时,它都应该生成一个自定义的主键,以便插入到数据库表中。

  2. 同样在Delete的情况下,它不应该执行删除操作。它不仅应该将Deleted字段修改为1,还应该在其他一些字段中插入数据,如ModificationDate,Time等。

  3. 如果我需要使用存储过程,也请告诉我。

  4. 注意:“主键”列是非种子varchar列。

    public class Child {
        [Key]
        public string ChildCounter { get; set; }
        public string CouncilCode { get; set; }
        public string CentreCode { get; set; }
        public string DateBirth { get; set; }
        public string GivenNames { get; set; }
        public string FamilyName { get; set; }
        public string FatherCounter { get; set; }
    
        public virtual Father Father { get; set; }
    }
    

    我是EF的新手,所以任何代码示例都应该受到高度赞赏。

      public ActionResult Create() {
            return View();
        }
    
        //
        // POST: /Child/Create
    
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(tblChild tblchild) {
            if (ModelState.IsValid) {
                db.tblChilds.Add(tblchild);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
    
            return View(tblchild);
        }
    
    
        public ActionResult Delete(string id = null) {
            tblChild tblchild = db.tblChilds.Find(id);
            if (tblchild == null)
                return HttpNotFound();
            return View(tblchild);
        }
    
        //
        // POST: /Child/Delete/5
    
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteConfirmed(string id) {
            tblChild tblchild = db.tblChilds.Find(id);
            db.tblChilds.Remove(tblchild);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    

1 个答案:

答案 0 :(得分:0)

<强> 1

要自己设置主键,请添加DatabaseGeneratedOption.None属性:

public class Child
{
   [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]  //<<<<---
   public string ChildCounter { get; set; }
   ...
}

这将允许您将ChildCounter属性设置为您需要的任何属性。

<强> 2

要进行逻辑删除,您需要添加Deleted布尔属性或类似于模型,然后更新而不是删除对象:

public class Child
{
   [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
   public string ChildCounter { get; set; }
   ...
   public bool Deleted {get; set;}  //<<<<---
}

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(string id)
{
    var tblchild = db.tblChilds.Find(id);
    tblchild.Deleted = true;
    db.SaveChanges();
    return RedirectToAction("Index");
}

当您希望显示子项目列表时,您需要记住确保只从数据库中撤回非“删除”项目:

var childItems = db.tblChilds.Where(c => !c.Deleted).ToList();

第3

根本不需要使用存储过程。