专栏首页平凡少年EntityFramework使用总结(与MVC4.0实现CURD操作)

EntityFramework使用总结(与MVC4.0实现CURD操作)

本篇文介绍一下Entity Framework Code First的简单用法,通过一个学生信息的增删查改来学习Entity Framework的使用及与存储过程的交互。我也是学习Entity Framework新手,有说的不对地方欢迎指正。

本文使用的开发环境为VS2010(sp1)+MVC4.0+EF5.0。

一、我们新建一个空MVC空项目

添加EntityFramework.dll的引用。

二、修改配web.config置文件(web.config为根目录下的)

添加EntityFramework配置和数据库连接字符串。

 <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
  <connectionStrings>
    <add name="strConn" connectionString="Data Source=ERIC\SQLEXPRESS;Initial Catalog=EfSample;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

三、在Models文件夹下新建Students.cs和DbHelper.cs

1、Students为学生信息实体类,并关联数据库表和其他一些属性说明,代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;

namespace MVCEF.Models
{
    [Table("tb_Students", Schema = "dbo")]//关联数据表 dbo.tb_Students
    public class Students
    {
        [Key]
        public string Num { get; set; }
        [MaxLength(10),Required(ErrorMessage="姓名不能为空")]
        [Column(TypeName = "nvarchar")]
        public string Name { get; set; }
        public int Age { get; set; }
        [MaxLength(10)]
        [Column(TypeName = "varchar")]
        public string Sex { get; set; }
        [MaxLength(50)]
        public string Class { get; set; }
    }
}
说明:用属性Key说明的字段如果是int类型,EF会默认该字段对应的数据库表字段是自增的,好像是这样的,说的不对的请纠正。

2、DbHelper.cs主要创建数据库上下文,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Data.Entity.Migrations;

namespace MVCEF.Models
{
    public class DbHelper:DbContext
    {
        public DbHelper()
            : base("strConn")
        {
            //自动创建表,如果Entity有改到就更新到表结构
            Database.SetInitializer<DbHelper>(new MigrateDatabaseToLatestVersion<DbHelper, ReportingDbMigrationsConfiguration>());
        }
        public DbSet<Students> Students { get; set; }
    }
    internal sealed class ReportingDbMigrationsConfiguration : DbMigrationsConfiguration<DbHelper>
    {
        public ReportingDbMigrationsConfiguration()
        {
            AutomaticMigrationsEnabled = true;//任何Model Class的修改將會直接更新DB
            AutomaticMigrationDataLossAllowed = true;
        }
    }
}
说明:这里还需要请用System.Data.Entity.DLL
要不然会报如下的一个错误:

 四、我们创建表tb_Students和存储过程proc_1

CREATE TABLE [dbo].[tb_Students](
    [Num] [varchar](128) NOT NULL,
    [Name] [nvarchar](10) NOT NULL,
    [Age] [int] NULL,
    [Sex] [varchar](10) NULL,
    [Class] [nvarchar](50) NULL,
PRIMARY KEY CLUSTERED 
(
    [Num] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
create proc proc_1
@Num varchar(128),
@Name varchar(50)
as 
select * from dbo.tb_Students where Num=@Num and Name=@Name

五、HomeController.cs调用EF方法实现增删改查。

方法都比较简单,这里就不做详细说明了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MVCEF.Models;
using System.Data;
using System.Data.SqlClient;

namespace MVCEF.Controllers
{
    public class HomeController : Controller
    {
        DbHelper db = new DbHelper();
        private static List<Students> listStu = new List<Students>()
        {
            new Students(){Num="s0001",Name="张三",Age=19,Sex="man",Class="计算机1班"},
            new Students(){Num="s0002",Name="李四",Age=20,Sex="man",Class="计算机1班"},
            new Students(){Num="s0003",Name="王五",Age=18,Sex="man",Class="计算机1班"},
            new Students(){Num="s0004",Name="小红",Age=17,Sex="women",Class="计算机'\"1班"},
        };
        //
        // GET: /Home/

        public ActionResult Index()
        {
            //如果没有数据初始化数据
            if (db.Students.Count() == 0)
            {
                listStu.ForEach(it =>
                    {
                        db.Students.Add(it);
                    });
                db.SaveChanges();
            }
            List<Students> lst = db.Students.ToList();
            //实现2:sql语句实现
            //List<Students> lst = db.Students.SqlQuery("select * from tb_Students").ToList();
            //与存储过程交互
           // var result = db.Database.SqlQuery<Students>("exec proc_1 @p0,@p1", "s0001","张三1").ToList();
            return View(lst);
        }
        public ActionResult Add()
        {
            return View(new Students());
        }
        [HttpPost]
        public ActionResult Add(Students stu)
        {
            string Message = string.Empty;
            if (db.Students.Where(it => it.Num == stu.Num).FirstOrDefault()!=null)
            {
                Message = "学号已经存在";
                ViewBag.Msg = Message;
                return View();
            }
            db.Students.Add(stu);
            db.SaveChanges();
            return RedirectToAction("Index","Home");
        }

        public ActionResult edit(string id)
        {
            var stu=db.Students.Where(it => it.Num == id).FirstOrDefault();
            return View(stu);
        }
        [HttpPost]
        public ActionResult edit(Students stu, FormCollection form,string id)
        {
            stu.Num = id;
            db.Entry(stu).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index", "Home");
        }
        //删除
        public ActionResult Del(string id)
        {
            /*方法1
            var stu = db.Students.Where(it => it.Num == id).FirstOrDefault();
            db.Entry(stu).State = EntityState.Deleted;
            db.SaveChanges();
             */
            //方法2
            string strsql = "delete from tb_Students where Num=@Num";
            SqlParameter[] paras =
           {
               new SqlParameter("@Num",SqlDbType.NVarChar,128)
           };
            paras[0].Value=id;
            db.Database.ExecuteSqlCommand(strsql, paras);
            db.SaveChanges();
            return RedirectToAction("Index", "Home");
        }
    }
}

六、EF与存储过程交互

EF与存储过程交互详见Index方法: var result = db.Database.SqlQuery<Students>("exec proc_1 @p0,@p1", "s0001","张三1").ToList();
其中@p0,@p1为传入存储过程中的参数(依次对应存储过程参数@Num和@Name)。
我们在使用EF调用存储过程的时候传入的参数为@p0,@p1,@p2,@p3 依此排列下去(蛋疼不知道为啥这样设计)

但是如何获取存储过程的返回值和out参数我还没有找到,如果你知道希望能留下你的答案,共同学习。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MVC4+WebApi+Redis Session共享练习(上)

    这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱不少花,病没治好,还增加了新病,哎不说了,周末还得去大医院检查一下,趁女盆友还没有回来,把前几天写的东西...

    写代码的猿
  • 数据访问模式之Repository模式

    数据访问层无非就是对数据进行增删改查,其中增、删、改等我们可以抽象出来写一个公共的接口或抽象类来定义这些方法,并采用一个基类实现这些方法,这样该基类派生的子类都...

    写代码的猿
  • 通过反射实现IOC功能

    这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac、Ninject、Utity...

    写代码的猿
  • ASP.NET Web API 接口执行时间监控

    软件产品常常会出现这样的情况:产品性能因某些无法预料的瓶颈而受到干扰,导致程序的处理效率降低,性能得不到充分的发挥。如何快速有效地找到软件产品的性能瓶颈,则是我...

    张善友
  • 与编解码专家Pankaj Topiwala回顾视频编码发展

    本段采访来自The Video Insiders。Video Insiders与业内最重要的编解码器专家之一,FastVDO的首席执行官Pankaj Topiw...

    用户1324186
  • Linux下的五个查找命令,有什么区别?

    学习Linux命令,就得会看帮助文档,不然选项太多,根本记不住。常用的帮助文档命令有man,info,--help。一般用man比较多,比help命令细,比in...

    Java识堂
  • 预测分析|机器学习是如何预测《权利的游戏》中的叛徒

    几个月之前,Airbnb发布了一篇博文,在这篇文章中作者向读者介绍了他们的数据科学家建立一个机器学习模型来保护自己的用户免遭来自恶意行为的欺诈危害。如果我们将具...

    灯塔大数据
  • python+ldap实例

    首先需要安装python-ldap的模块 http://www.python-ldap.org/。 在这里用的是windows系统,当然比较容易,下载地址 ht...

    py3study
  • C#打开文件对话框(OpenFileDialog)

    打开文件对话框(OpenFileDialog)    1、   OpenFileDialog控件有以下基本属性      InitialDirectory...

    阳光岛主
  • 如何全方面的保障项目质量?(二)

    第一章讲了保障项目质量的前6点,是关于比较基础的,接下来是比较虚的知识点,也就是是意识上的东西,对于测试人员和管理层会有比较大的提点,话不多说,续上:

    厦门-安仔

扫码关注云+社区

领取腾讯云代金券