某某茶叶有限公司欢迎您!
金沙棋牌在线 > 必赢棋牌官网 > ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

ASP.NET没有魔法——ASP.NET MVC 与数据库之Entity Framework Migrations

时间:2020-02-15 04:15

Entity Framework 4.1支撑代码优先(code first)编制程序形式:就能够以先创设模型类,然后经过配备在EF4.1下动态变化数据库。

  在开垦数据库应用程序的时候,平日会遇到一些表必要增添字段恐怕修正类型、新增添表等须要,而对此EF Code First来讲关心的独有实体类,当必要变动时只必要增添新的实体类只怕在实体类中加多、删除、改正属性就能够。然而修正完毕现在要怎么着将改善同步到数据库中?

必赢棋牌官网 1

接纳工具:sql server 2011,vs2017 由于书籍中运用的sql server,所以在本书的求学中央银行使的数据库为sql servier 2011。学习在此之前,先将书籍中动用到的数据库附加进去。数据分享:northwnd链接: 密码:fuh7

下边演示二种意况:

  Entity Framework提供了Migrations机制来消除这一难点。

 

  • 率先加多实人体模型型(ado.net 实体数据模型),一路安装下来就能够了,并不会像连接mysql同样会遇上丰富多彩的难题。

    必赢棋牌官网 2

  • 表明安装境况通过edmx能够见到,几张表已经加载进来了

    必赢棋牌官网 3

    下一场经过调节和测验再来看看数据意况,尝试从orders表中查询id为10248的订单数量:

    必赢棋牌官网 4由上海教室,可以知道对应的那条数据已经被查出来了。

1、代码优先进表率式下,asp.net mvc数据访问

  本文要点:

再来一张,接纳 MVC 模版,其余的没选过,不会用 =_=!! 身份验证用个人客商账户,那一个是为着偷懒,话说 ASP.NET Identity  照旧很给力的,不用白不用 ^_^~

2.1 新增

在这里间能够当心下方法二DbEntityEntry的利用,由于这里面包车型大巴Order在数据库中有了节制,纵然设置11090,实际步向进来的依旧依次增加1的数额参与。

必赢棋牌官网 5

2、守旧格局,先创设数据库和表,配置连接字符串,再生成模型

  ●启用Migrations
  ●通过Add-Migration添加Migration
  ●Update-Database更新数据库
  ●更新模型并增添新的Migration
  ●运转应用时自动将数据库更新至最新版本
  ●关于Automatic Migrations(自动迁移卡塔尔

 

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); }

调用结果:

必赢棋牌官网 6

 

启用Migrations

  在VS中的Package Manager Console窗口中甄选私下认可项目为DbContext存在的体系,并实行命令:
  enable-migrations

  必赢棋牌官网 7

  然后项目中校生成Migrations目录和Configuration类型:

  必赢棋牌官网 8

  必赢棋牌官网 9

  布局方法:用于对一些Migrations相关的布局,如上代码正是禁止使用了全自动员搬迁移。
  Seed方法:依据注释可见在搬迁后举办,平日用来增加暗许数据。Configuration类型可以依靠须要开展更换。

  注:如过出现以下错误,可把命名空间删除修复:

   必赢棋牌官网 10

必赢棋牌官网 11

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.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);

调用结果:

必赢棋牌官网 12

第意气风发种情景的手续:

通过Add-Migration添加Migration

  倘使已经存在数据库那么须求利用–IgnoreChanges参数来成立二个空的Migration来对相应前的数据库模型:
  Add-Migration InitialCreate –IgnoreChanges

  必赢棋牌官网 13

  这时候在Migrations目录下会转换三个带时间戳的InitialCreate.cs文件:

  必赢棋牌官网 14

  注:上边的代码的Up和Down方法之所感到空是因为运用了–IgnoreChanges参数,因为数据库中已经有相应的表和字段,所以不该再制造贰遍,假设去掉该参数会变卦以下代码:

  必赢棋牌官网 15

 

 

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();

调用结果:

必赢棋牌官网 16

其生机勃勃地点修改的速度有一点慢啊,打字与印刷下看看用了多长时间……不是吧,用了那么久,798ms,纠正一条记下竟然用了798ms。

必赢棋牌官网 17用时总计大家再来看看查询用了多久:此时并不清楚为何用时降了下去,不过的确查询确实是占了十分的大的意气风发段的年月的。必赢棋牌官网 18

咱俩再看看是或不是由于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>; Console.WriteLine("修改前:" + result.FirstOrDefault().ContactName); DateTime d3 = DateTime.Now; Console.WriteLine("查询用时:" + .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("共用时:" + .Milliseconds + "ms"); Console.ReadLine(); } }

必赢棋牌官网 19必赢棋牌官网 20

依附EF查询最快用时,依然比一向利用sql慢100ms左右的。这一个地点做了两次测量检验,可以看到直接运用sql举行询问要比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.Take; 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 { Console.WriteLine("{0},{1},{2}",q.OrderId,q.ProductId,q.UnitPrice); } Console.ReadLine(); } }

必赢棋牌官网 21image.png

优势:

  • 支付简要介绍
  • 频率增高
  • 自动化水平提升
  • 可适用于原始老项目短处:
  • 属性不佳
  • 领悟的人少之甚少
  • 学习花销高,对开辟职员的渴求相对较高

(1)使用航空模型板,创制ASP.NET MVC3.0(或4.0)项目,假定项目名:MVC_Student

Update-Database更新数据库

  奉行Update-Database目录来更新数据库:
  update-database -StartUpProjectName 'My Blog' -ProjectName BlogRepository.MySQL
  注:由于本例的DbContext相关项目在BlogRepository.MySQL中,可是接连字符串在My Blog项目中,所以在试行数据库更新时索要内定运转项目和项目名称多个参数。日常意况下利用update-database命令就能够。

  必赢棋牌官网 22

  当时数据库中多了一个名号为__MigrationsHistory表并有一条记下。

  必赢棋牌官网 23

点击分明现在,拜见到以下分界面:

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] 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然后扩充创办数据库。

    必赢棋牌官网 24

    必赢棋牌官网,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>

调解运维

必赢棋牌官网 25

这时,在分界面上并未反映关于数据库相关的展示。不过能够在SQL Server中查阅代码是或不是已经举行:

必赢棋牌官网 26于是在Controller中的代码依然试行到位的。

微信公众号:

必赢棋牌官网 27公众号.png

注意:创制完项目后,项目会活动引用EF4.1

更新模型并增加新的Migration

  1. 为模型加上贰个新的习性"IsPublish"来代表文章是否被公开:

  必赢棋牌官网 28 

  2. 运作Add-Migration命令,名称最为与改观有关用于区分多个Migration便于维护:
  add-migration addIsPublishColumn

  必赢棋牌官网 29

  实践命令后会生成一个DbMigration的子类,该项目中包罗三个Up和Down方法,分别对应更新时和回降时对数据库的操作:

  必赢棋牌官网 30

  上边的Up方法正是为dbo.Posts表增多名叫"IsPublish"的列,要是回滚那些Migration时则把该列删除。

  3. 再一次行使update-database命令将新的改换同步到数据库中:

  update-database -StartUpProjectName 'My Blog' -ProjectName BlogRepository.MySQL -Verbose

  必赢棋牌官网 31

  注:使用参数-Verbose能够见到更加的多推行消息,满含推行的SQL语句。

 

(2)在Model文件夹下,创立数据库上下文类:StuDBContext

起步应用时自动将数据库更新至最新

  运行应用时将数据库更新至最新能够总结“update-database”命令实施那大器晚成进度,只必要增多了Migration,而且该Migration未有一块到数据库,那么在行使实施(实际上是DbContext在创造模型时OnModelCreating卡塔尔国将会把校正同步到数据库。

  1. 添加ClickCount属性:

  必赢棋牌官网 32

  2. 在DBContext类型中增加OnModelCreating方法及代码(注:该操作也得以通过配备文件配置卡塔尔(قطر‎:

  必赢棋牌官网 33

  3. 周转程序:

  必赢棋牌官网 34

  4. 翻看结果:

  必赢棋牌官网 35

必赢棋牌官网 36

public class StuDBContext:DbContext
    {
        public StuDBContext()
            : base("DataConn")
        {
        }

至于Automatic Migrations(自动员搬迁移卡塔尔国

  自动员搬迁移指的是在施行“update-database”命令时,将相比较实体模型与数据库布局,即使它们有异样则以实人体模型型为准,将差异同步到数据库。约等于简单了add-migration命令。

  在实行运行搬迁命令(enable-migrations 卡塔尔国时,能够增加参数–EnableAutomaticMigrations也许在生成待Configuration类型的布局方法中校AutomaticMigrationsEnabled的值设为true。

  必赢棋牌官网 37

  自动更新数据库(migrate database to latest versionState of Qatar与机动员搬迁移(automatic migrationsState of Qatar,前面叁个省略“update-database”前者省略“add-migration”,要是一齐行使则两个都简短,开采者仅需经过enable-migrations命令开启迁移,然后在付出中期维修改完结实体类,就足以调节和测量检验程序,调节和测量检验程序进程中自动更新数据库架构。

  

小结:
  本章首倘若介绍EF的搬迁功能,对于EF来讲那是八个老大关键的效应,因为在开拓进程中刻意是code first开辟进度中,平常会助长实体、修正实体性质以至会在动用Fluent API来映射数据库关系的时候也会指向某个质量举办改造,如字段类型、最大尺寸以至索引等。

  对于自动更新数据库以致机关迁移作用,个人不提出在组织花销规范项目时行使,因为运用Add-Migration命令能够很好的寻踪数据库构造的立异,何况能够依据事态张开回滚。而自动更新数据库会产生数据库构造改动,团队职业中黄金时代旦几人使用了同二个数据库并且在代码未共同期会诱致错误的面世。
  但启用自动员搬迁移而且安装数据库伊始化时自动将数据库更新至最新将节省数不清操作。有利有弊可凭仗景况选用。

 

参考:

  

 

本文连接:

ASP.NET未有法力——目录

 

        public DbSet<StudentInfo> Students { get; set; }
    }

施工方案构造:

(3)创建域模型:StudentInfo

 

public class StudentInfo
    {
        public int ID { get; set; }
        public string StuNO { get; set; }
        public string StuName { get; set; }
        public string StuPhoto { get; set; }
        public DateTime StuBirthday { get; set; }
        public string StuAddress { get; set; }
    }

必赢棋牌官网 38

(4)在web.config中配备连接字符串(也得以不配备,EF自动物检疫查并接受SQL SE奇骏VEXC60 EXPRESS,此处我们钦点服务器和数据库)

 

<connectionStrings>
  <!--<add name="StuDBContext" connectionString="server=(local卡塔尔;database=MyStudent;uid=(登陆账户);pwd=(登入密码)" providerName="System.Data.SqlClient"/>-->
  <add name="DataConn" connectionString="server=(local卡塔尔;database=MyStudent;uid=(登陆账户);pwd=(登入密码)" providerName="System.Data.SqlClient"/>
 </connectionStrings>

先更新黄金时代把先:

(5)生成项目,为第(6)步服务

必赢棋牌官网 39

(6)右击“Controllers"文件夹,选拔”增加调控器“,如图:

 

必赢棋牌官网 40

必赢棋牌官网 41

单击显明后,会在Controllers文件夹下生成一个StudentController类,何况在Views文件夹下生成Student子文件夹,当中带有5个.cshtml文件,如图:

 

必赢棋牌官网 42

好呢,开工吧!!在Models目录下树立博客分类(Category)和博客(Post)八个类,代码贴在底下

(7)改善Global.asax.cs的暗许路由:

Category:

routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 U索罗德L
                new { controller = "Student", action = "Index", id = UrlParameter.Optional } // 参数默许值
            );

必赢棋牌官网 43

(8)最后,单击”调节和测量试验“菜单,选拔”运维调节和测量试验“,或直接按F5.会看见如下效果:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ShowPin.Web.Models
{
    /// <summary>
    /// 分类
    /// </summary>
    public class Category
    {
        public Category()
        {
            this.Posts = new List<Post>();
        }
        /// <summary>
        /// 获取或设置分类标题
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 该分类下的内容集合
        /// </summary>
        public virtual ICollection<Post> Posts { get; set; }

    }
}

必赢棋牌官网 44

必赢棋牌官网 45

(9)能够单击”Create New"超链接,向数据库增加一条记下

 

(10)那时候得以张开数据库服务器,会发掘自动成立了MyStudent的数据库(对应连接字符串中的数据库)和StudentInfoes表(是模型类名称的复数格局,表中的各字段分别对应模型类中的属性,此处要极其注意:ID属性会自行对应表中的自增加主键列。

Post:

 

必赢棋牌官网 46

上述措施要求小心的地点:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ShowPin.Web.Models
{
    /// <summary>
    /// 博文
    /// </summary>
    public class Post
    {

        /// <summary>
        /// 获取或设置内容标题
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 获取或设置内容
        /// </summary>
        public string Content { get; set; }

        /// <summary>
        /// 获取或设置内容发布日期
        /// </summary>
        public DateTime CreateDate { get; set; }

        /// <summary>
        /// 获取或设置点击数
        /// </summary>
        public int hits { get; set; }

        /// <summary>
        /// 获取或设置分类ID
        /// </summary>
        public string CategoryId { get; set; }

        /// <summary>
        /// 获取或设置分类
        /// </summary>
        public virtual Category Category { get; set; }
    }
}

(1)web.config中连连字符串,providerName要提供,不然报错。

必赢棋牌官网 47

(2)模型的ID属性是原则性的, 要不就要用元数据注解,EF4.1会自行将之映射为表的主键(自拉长)。

 

(3)数据库实体上下文名称经常与连接字符串name属性的值相似,但本文中不一样(数据库实体上下文是StuDBContext,连接字符串名称:DataConn),借使雷同,那么实体上下文类能够不提供布局函数。倘诺不相仿,如本例中,可以为实体上下文增添布局函数,并调用父类构造函数,在base(State of Qatar中传送与实业上下文类名分歧的接连几日字符串名称(本例中时DataConn,如步骤(2)金黄注解)

好了,接下去正是有趣的事中的DBContext

 ________________________________________________________________________________________________________________________________________

ObjectContext:

上边演示第2种状态:先成立数据库情势,然后生成模型

必赢棋牌官网 48