第2章 Entity Framework——ASP.NET MVC企业级实战

使用工具:sql server 2012,vs2017
  由于书籍中使用的sql server,所以在本书的学习中使用的数据库为sql servier 2012。学习之前,先将书籍中利用到的数据库附加进去。
数据分享:northwnd
链接:https://pan.baidu.com/s/1i6FSRlj 密码:fuh7

目录

1.DBFirst

2 Entity Framework增删改查

3 LINQ To EF

4 Code First 开发方式

1.DBFirst

  • 首先添加实体模型(ado.net 实体数据模型),一路安装下去就可以了,并不会像连接mysql一样会遇到各种各样的问题。


  • 验证安装情况
    通过edmx可以看到,几张表已经加载进来了



    然后通过调试再来看看数据情况,尝试从orders表中查询id为10248的订单数据:



    由上图,可见对应的那条数据已经被查出来了。

2 Entity Framework增删改查

2.1 新增

在这里可以留意下方法二DbEntityEntry的使用,由于这里面的Order在数据库中有了限制,虽然设置11090,实际加入进去的还是递增1的数据加入。


2.2根据条件排序和查询

使用以下的方式进行查询,需要先引入System.Linq.Expressions;
使用这种方式,需要先了解下Experssion的以及lambda的使用方式。
方法代码:

 #region 测试根据条件排序和查询
        public static List<Customers> GetListBy<Tkey>(Expression<Func<Customers, bool>>
            whereLambda, Expression<Func<Customers, Tkey>> orderLambda)
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                return entity.Customers.Where(whereLambda).OrderBy(orderLambda).ToList();
            }
        }
        #endregion

调用方式:

 static void Main(string[] args)
        {
            Expression<Func<Customers, bool>> whereLambda = (Customers) => Customers.CustomerID  == "alen";
            Expression<Func<Customers, string>> orderLambda = (Customers) => Customers.CustomerID;
            var result = FunctionMethods.GetListBy<string>(whereLambda,orderLambda);
        }

调用结果:


2.3 分页查询

方法代码:

 #region 分页查询
        public static List<Customers> GetPagedList<Tkey>(int pageIndex, int pageSize, 
            Expression<Func<Customers, bool>> whereLambda, Expression<Func<Customers, Tkey>> orderLambda)
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                return entity.Customers.Where(whereLambda).OrderBy(orderLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
            }
        }
        #endregion

调用方式:

 //分页查询
            Expression<Func<Customers, bool>> whereLambda = (Customers) => Customers.CustomerID.Length < 4;
            Expression<Func<Customers, string>> orderLambda = (Customers) => Customers.CustomerID;
            int pageIndex = 1;
            int pageSize = 10;
            var result = FunctionMethods.GetPagedList(pageIndex,pageSize,whereLambda,orderLambda);

调用结果:


2.4 修改

方法代码:

 #region 修改
        public static void Edit()
        {
            using (NorthwindEntities entiy = new NorthwindEntities())
            {
                Customers _Customer = entiy.Customers.Where(x => x.CustomerID == "alen").FirstOrDefault();
                Console.WriteLine("修改前:" + _Customer.ContactName);

                _Customer.ContactName = "张中华";
                entiy.SaveChanges();
                Console.WriteLine("修改成功:" + _Customer.ContactName);

                Console.ReadLine();

            }
        }
    
        #endregion

调用方式:

 //修改
            FunctionMethods.Edit();

调用结果:



这个地方修改的速度有点慢啊,打印下看看用了多久……
不是吧,用了那么久,798ms,修改一条记录竟然用了798ms。


用时统计

我们再来看看查询用了多久:
这个时候并不清楚为什么用时降了下来,但是确实查询确实是占了很大的一段的时间的。

我们再看看是不是由于EF查询的速度跟不上,使用SQL进行查询:
方法代码:

 public static void EditBySql()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                DateTime d1 = DateTime.Now;

                string sql = "select top 1 * from Northwind.dbo.Customers where CustomerID = 'alen'";


                var result = entity.Database.SqlQuery<Customers>(sql);

                Console.WriteLine("修改前:" + result.FirstOrDefault().ContactName);

                DateTime d3 = DateTime.Now;
                Console.WriteLine("查询用时:" + (d3 - d1).Milliseconds + "ms");


                string sqlUpdate = "update Northwind.dbo.Customers set ContactName = '小小张' where CustomerID = 'alen'";

                var result1 = entity.Database.ExecuteSqlCommand(sqlUpdate);
                Console.WriteLine("修改成功:" + result1);

                DateTime d2 = DateTime.Now;
                Console.WriteLine("共用时:" + (d2 - d1).Milliseconds + "ms");
                Console.ReadLine();

            }
        }


根据EF查询最快用时,还是比直接使用sql慢100ms左右的。这个地方做了两次测试,可见直接使用sql进行查询要比EF还是快得多的,将近一半用时左右。

3 LINQ To EF

方法代码:

 #region LINQ To EF
        public static void LINQToEF()
        {
            using (NorthwindEntities entity = new NorthwindEntities())
            {
                //简单查询
                var result = from c in entity.Customers select c;
                Console.WriteLine("简单查询,第一条数据ContactName" + result.FirstOrDefault().ContactName);

                //条件查询
                //普通linq写法
                var result1 = from c in entity.Customers where c.CustomerID.Length > 0 select c;
                Console.WriteLine("条件查询:普通linq写法,第一条数据ContactName:" + result1.FirstOrDefault().ContactName);
                
                //Lambda表达式写法
                var result2 = entity.Customers.Where(x => x.CustomerID.Length > 0).ToList();
                Console.WriteLine("条件查询:Lambda表达式写法,第一条数据ContactName:" + result2.FirstOrDefault().ContactName);

                //排序分页
                IQueryable<Customers> result3 = (from c in entity.Customers orderby c.CustomerID select c).Skip(0).Take(10);
                Console.WriteLine("排序分页:第一条数据ContactName:" + result3.FirstOrDefault().ContactName);

                //连接
                var query = from d in entity.Order_Details
                            join order in entity.Orders on d.OrderID equals order.OrderID
                            select new
                            {
                                OrderId = order.OrderID,
                                ProductId = d.ProductID,
                                UnitPrice = d.UnitPrice
                            };
                foreach (var q in query.Take(5))
                {
                    Console.WriteLine("{0},{1},{2}",q.OrderId,q.ProductId,q.UnitPrice);
                }

                Console.ReadLine();


            }

        }
image.png

4 Code First 开发方式

优势:

  • 开发简介
  • 效率提高
  • 自动化程度提高
  • 可适用于原有老项目
    劣势:
  • 性能不好
  • 了解的人比较少
  • 学习成本高,对开发人员的要求相对较高
4.1创建Code First Demo
  • 1 新建ASP.NET MVC4 Web 应用程序,项目模版选择“空”
  • 2 引入程序集EntityFramework和System.Data.Entity
  • 3在Models文件加下面新建Order.cs和OrderDetail.cs模型类文件
    Order代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace CodeFirstDemo.Models
{
    public class Order
    {
        /// <summary>
        /// 属性名后面有Id,默认会当成主键,可以不用添加[Key]属性
        /// </summary>
        [Key]
        public int OrderId { get; set; }
        /// <summary>
        /// 订单号
        /// </summary>
        [StringLength(50)]
        public string OrderCode { get; set; }
        /// <summary>
        /// 订单金额
        /// </summary>
        public decimal OrderAmount { get; set; }
        /// <summary>
        /// 导航属性设置成virtual,可以实现延迟加载
        /// </summary>
        public virtual ICollection<OrderDetail> OrderDetail { get; set; }
    }
}

OrderDetail代码如下:

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

namespace CodeFirstDemo.Models
{
    public class OrderDetail
    {
        [Key]
        public int OrderDetailId { get; set; }
        /// <summary>
        /// 订单明细单价
        /// </summary>
        public decimal Price { get; set; }
        /// <summary>
        /// 订单明细数量
        /// </summary>
        public int Count { get; set; }
        /// <summary>
        /// 外键,如果属性名称和Order主键名称一样,默认会当成外键,可以不加ForeignKey特性
        /// </summary>
        [ForeignKey("OrderBy")]
        public int OrderId { get; set; }

        /// <summary>
        /// 导航属性
        /// </summary>
        public virtual Order OrderBy { get; set; }
    }
}
  • 4 在配置文件中写连接字符串
<connectionStrings>
    <add name="CodeFirstDemoModel" connectionString="server=.;database=CodeFirstDamo;uid=sa;pwd=Password" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  • 5 创建上下文
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace CodeFirstDemo.Models
{
    public class CodeFirstContext:DbContext
    {
        /// <summary>
        /// 注意这里的name要和配置文件里面配置的上下文连接字符串名称一致
        /// </summary>
        public CodeFirstContext() : base("name=CodeFirstContext") { }
        public DbSet<Order> Order { get; set; }
        public DbSet<OrderDetail> OrderDetail { get; set; }

    }
}
  • 6 在controller层创建一个homecontroller然后进行创建数据库。



    HomeController.cs代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CodeFirstDemo.Models;

namespace CodeFirstDemo.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            CodeFirstContext db = new CodeFirstContext();
            db.Database.CreateIfNotExists();
            return View(db.Order.ToList());
        }
    }
}

在这里并没有像书上写的那么使用,之后再看为什么把db写成一个属性使用。
Home/Index.cshtml代码


@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

调试运行



此时,在界面上并没有体现关于数据库相关的显示。但是可以在SQL Server中查看代码是否已经执行:



所以在Controller中的代码还是执行完成的。

联系方式

个人微信

公众号_DotNet微说.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容