码迷,mamicode.com
首页 > Web开发 > 详细

MVC5+EF6

时间:2016-04-28 10:36:43      阅读:384      评论:0      收藏:0      [点我收藏+]

标签:

一、EF的增删改:

//新建用户

public ActionResult Create()

{

return View();

}

[HttpPost]

public ActionResult Create(SysUser sysUser)

{

db.SysUsers.Add(sysUser);

db.SaveChanges();

return RedirectToAction("Index");

}

修改用户:

//修改用户

public ActionResult Edit(int id)

{

SysUser sysUser = db.SysUsers.Find(id);

return View(sysUser);

}

[HttpPost]

public ActionResult Edit(SysUser sysUser)

{

db.Entry(sysUser).State = EntityState.Modified;

db.SaveChanges();

return RedirectToAction("Index");

}

删除用户:

//删除用户

public ActionResult Delete(int id)

{

SysUser sysUser = db.SysUsers.Find(id);

return View(sysUser);

}

[HttpPost, ActionName("Delete")]

public ActionResult DeleteConfirmed(int id)

{

SysUser sysUser = db.SysUsers.Find(id);

db.SysUsers.Remove(sysUser);

db.SaveChanges();

return RedirectToAction("Index");

}

NOTE

涉及到数据更新的地方都有两个同名的方法重载,一个用来显示[HttpGet],一个用来数据更新[HttpPost]

  1. 在右键方法名,生成相应的View

    每个View的顶部需要添加一个声明

    @model MVCDemo.Models.SysUser

  2. 如果是要用到foreach,每个View的顶部需要添加一个声明

    @model IEnumerable<MVCDemo.Models.SysUser>

二、EF封装成通用的增删改

namespace ZN.DAL
{
public partial class BaseRepository<T> where T : class
{
//EF上下文的实例保证,线程内唯一
//实例化EF框架
//DataModelContainer db = new DataModelContainer();
//获取的实当前线程内部的上下文实例,而且保证了线程内上下文实例唯一
private DbContext db = EFContextFactory.GetCurrentDbContext();
//添加
public T AddEntities(T entity)
{
db.Entry<T>(entity).State = EntityState.Added;
//db.SaveChanges();
return entity;
}
//修改
public bool UpdateEntities(T entity)
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Modified;
//db.Entry<T>(entity).State= EntityState.Unchanged;
//return db.SaveChanges() > 0;
return true;
}

//删除
public bool DeleteEntities(T entity)
{
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
//return db.SaveChanges() > 0;
return true;
}
//查询
public IQueryable<T> LoadEntities(Func<T, bool> wherelambda)
{
return db.Set<T>().Where<T>(wherelambda).AsQueryable();
}
}
}

三、常见问题

关于mvc5+EF里面的db.Entry(model).State = EntityState.Modified报错问题

最近在使用mvc5+EF的的时候用到了这句话

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

看上去很简单的修改数据,但是一直报错,说是key已经存在,不能修改。

搞了很久,突发奇想的把前面的代码

  var approvalModel = CurrentUser.ApplicationForms.SingleOrDefault(t => t.ID == id).Approval;

  if(approvalModel!=null){

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

  }

改成  

if (db.Approvals.Any(t => t.ApprovalID == model.ApprovalID))
{
db.Entry(model).State = EntityState.Modified;
}

就不报错了。

是不是感觉很奇怪? 原因居然是approval已经取出来了,这是和数据库有关联,新的approval model虽然id一样但不是同一个对象,不能修改!

或者  

var db = new CarLoanDBContext();就是换一个db对象

四、NOTE

针对上面这些代码,我们提一下其中用到的HtmlHelper, 主要有这么几个:

DisplayNameFor (model=>model.xxx):生成纯文本,显示xxx列名

DisplayFor (model=>model.xxx): 生成纯文本,显示xxx列的内容

LableFor : 生成一个Lable标签

EditorFor : 生成一个text类型的input

PasswordFor : 类似于EditorFor, 隐藏文本内容

ActionLink :生成一个<a>标签

BeginForm :生成一个表单

 

MVC5+EF6

标签:

原文地址:http://www.cnblogs.com/xuanhai/p/5441672.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!