MVC学习笔记二:实现简单的增删改查
来源:互联网 发布:淘宝如何改实名认证 编辑:程序博客网 时间:2024/05/21 19:49
前面做了些准备工作,现在就是要利用EF实现对数据库表的增删改查了
打开项目,鼠标右击Controllers文件夹,将控制器名称改为:IphonesController 点击新建.
完成后会看到在Controllers文件夹下面多出了IphonesController.cs文件,打开文件,看到下面代码:
public class IphonesController : Controller { // // GET: /Iphones/ public ActionResult Index() { return View(); } }右击View新建视图,创建强类型视图,会发现在下拉列表中没有Iphones模型选择,编译也根本编译不通,这里比较让人费解,也许是要手动去创建Model,但是我太懒了,并没有这么做。
打开Apples.edmx文件,鼠标右击空白处,选择属性,代码生成策略改成“默认值”:
设置完成后,再用鼠标点击Apples.edmx下的Apples.Designer.cs文件,会发现里面自动生成了分部类ApplesContainer,但是这又带来一个问题,
在Apples.edmx文件下的Apples.Context.tt下的Apples.Context.cs里也有个分部类ApplesContainer,它们继承的不是同一个类...如下:
public partial class ApplesContainer : DbContext { public ApplesContainer() : base("name=ApplesContainer") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } }
public partial class ApplesContainer : ObjectContext { #region 构造函数 /// <summary> /// 请使用应用程序配置文件的“ApplesContainer”部分中的连接字符串初始化新 ApplesContainer 对象。 /// </summary> public ApplesContainer() : base("name=ApplesContainer", "ApplesContainer") { this.ContextOptions.LazyLoadingEnabled = true; OnContextCreated(); }我采用了两种方式解决:
方法一:使用ObjectContext
删除Apples.Context.tt文件。重新编译项目,这时候再去右击控制器下的Index方法,新建视图,选择强类型视图,这时候就有Iphones了。支架模板选择List。
注意,为什么要找Iphones这个类呢,其实这个类就是对应我们的数据库中的Iphones表,而它的属性对应的就是表中的列。这就是EF的一个映射模式。
在IphonesController.cs文件添加对ApplesContainer类的引用:
using FirstMvcWithEF.Entities;修改Index方法如下:
public ActionResult Index() { ApplesContainer db = new ApplesContainer(); return View(db.Iphones); //或者 //ViewData.Model = db.Iphones; //return View(); }
编译运行,在浏览器的地址栏后面添加/iphones,看到:
到这里查询算是成功了。
接下来看插入操作:实现点击上面的Create New连接向数据库中插入数据。
在Index方法下面,新建一个Create方法:
public ActionResult Create() { return View(); }同样的方式新建视图,支架模板选择Create,直接运行:
这时候如果点击Create按钮去post这个表单,是没有任何意义的,因为IphonesController控制器根本就没有一个post型的方法让表单去执行;
下面添加post方式的action方法:
[HttpPost] public ActionResult Create(Iphones iphone) { ApplesContainer db=new ApplesContainer(); db.Iphones.AddObject(iphone); db.SaveChanges(); return View("Index",db.Iphones); }
编译执行:
点击Create,可以看到数据插入成功!
接下来介绍修改数据:实现点击Edit能够修改数据。
同样新建一个Edit方法:
public ActionResult Edit(int id) { ApplesContainer db = new ApplesContainer(); var iphone = db.Iphones.FirstOrDefault(a => a.ID == id); ViewData.Model = iphone; return View(); }新建对应的视图,注意支架模板选择Edit,省的自己去编辑视图。
再新建一个post方式的方法,用于提交修改执行的方法:
[HttpPost] public ActionResult Edit(Iphones iphone) { ApplesContainer db = new ApplesContainer(); db.Iphones.Attach(iphone); db.ObjectStateManager.ChangeObjectState(iphone, EntityState.Modified); db.SaveChanges(); return View("Index",db.Iphones); }编译运行:点击某一个Edit,修改其数据:
点击Save:
修改已经成功。
接下来介绍删除:实现点击Delete删除数据。
同样,新建一个Delete方法及对应的post方法(默认Get不用加[HttpGet])]:
public ActionResult Delete(int id) { ApplesContainer db = new ApplesContainer(); var iphone = db.Iphones.FirstOrDefault(a => a.ID == id); ViewData.Model = iphone; return View(); } [HttpPost] public ActionResult Delete(Iphones iphone) { ApplesContainer db = new ApplesContainer(); db.Iphones.Attach(iphone); db.ObjectStateManager.ChangeObjectState(iphone, EntityState.Deleted); db.SaveChanges(); return View("Index", db.Iphones); }
编译运行:点击某一个Delete,
点击Delete:
确实删除成功!
到目前为止,方法一:使用ObjectContext进行增删改查,已经完成。
-----------------------------------------------------------------------------------------------------------------------------------------------
接下来使用第二种方式。
方法二:使用DbContext进行增删改查.
由于前面,直接把Apples.edmx下的文件给删除了,现在需要删除Apples.edmx,重新新建该文件。
新建时“选择从数据库生成”,由于我们的Web.config中已经配置过了,所以这里直接跳出了之前配置过的连接名称ApplesContainer.
选择之前生成的Ipones表:
创建完成后,打开下图两个红色直线标注的文件:
会发现第一个文件,相比之前的而言,多出了最后一行自动属性:
public partial class mydbEntities : DbContext { public mydbEntities() : base("name=mydbEntities") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public DbSet<Iphones> Iphones { get; set; } }
而第二个文件Iphones.cs是直接多出来的,它描述了Iphons表的结构:
public partial class Iphones { public int ID { get; set; } public string type { get; set; } public string color { get; set; } public decimal price { get; set; } }这时候打开IphonesController控制器,会发现原先些的代码出现了错误,原先的ApplesContainer都需要替换成mydbEntities,
还有,原先的AddObject方法,ObjectStateManager都不能用了。
将
db.Iphones.AddObject(iphone);
换成
db.Iphones.Add(iphone);的形式
,将
db.ObjectStateManager.ChangeObjectState(iphone, EntityState.Modified);换成形式:
db.Entry(iphone).State=EntityState.Modified;删除同样。Details就暂时不加了,跟前面删除Get形式一样。
编译运行:
增删改查都一样正常。
- MVC学习笔记二:实现简单的增删改查
- Spring MVC 学习笔记5 —— 实现简单的用户管理,增删改查(1)建立user model
- Python学习笔记-Django实现简单增删改查
- Mybatis笔记之二 -- 简单的增删改查
- MyBatis笔记二-增删改查-事务-简单的多表联查
- 【学习笔记】一个简单的在线通讯录:php实现简单的增删改查操作
- [入门]MySQL学习笔记二数据的增删改查
- mybatis学习笔记二(实现数据的增删改查)
- MVC实现增删查改
- mongodb实现简单的增删改查
- Hibernate实现简单的增删改查
- mongodb实现简单的增删改查
- mongodb实现简单的增删改查
- Mybatis实现简单的增删改查
- 学习笔记:mySQL的增删改查
- 使用jdbc实现简单的mvc模式的增删改查
- oracle 最简单的学习笔记,增删改查,PLSQL基本语法,游标,函数,存储过程的实现
- MVC实现通用的增删改查。使用接口(三)学习
- C#学习总结2013.10.24—2013.10.30
- 编译代码报出Android library projects cannot be launched错误的解决
- MySQL 编码设置
- oracle监听配置讲解
- poj 2385
- MVC学习笔记二:实现简单的增删改查
- (ios7) 解决代码布局View, ios7 中 subView 高度增加StatusBar20dp的问题,保证Ios6,ios7代码一致
- 【IO流一些小细节】IO流中一些方法的使用
- 传统社区的评论结构和百度贴吧的层级回复结构,大家觉得各有什么有缺点呢?
- OCP-1Z0-053-V12.02-50题
- Linux CentOS Mysql修改默认端口
- CSDN第一天
- 3.4 creat函数-创建文件
- LINUX下GDB调试