标签:
一、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]
每个View的顶部需要添加一个声明
@model MVCDemo.Models.SysUser
@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 :生成一个表单
标签:
原文地址:http://www.cnblogs.com/xuanhai/p/5441672.html