MVC+EF知识点

 

数据库上下文

用于处理获取、存储、更新数据库中的实例。需要继承实体框架DbContext。

using MvcMovie.Models;
using System.Data.Entity;

namespace MvcMovie.DAL
{
    public class MovieDBContext:DbContext
    {
        public DbSet<Movie> Movies { get; set; }
    }
}

DbSet<Movie>是数据库实体,数据库上下文操作的就是DbSet的实体。

数据库上下文默认找与类名相同的连接字符串,例如上面实例查找的字符串为:MovieDBContext。

也可以指定链接字符串,例如我们现在指定连接字符串名称为:MovieDBContext

public MovieDBContext() : base("MovieDBContext") { }

 

 LocalDB

LocalDB是轻量级的SqlServer数据库引擎。LocalDB运行中的SQL Server Express使您能够使用数据库的.mdf文件作为特殊的执行模式。

链接字符串不会自动创建,下面我们指定链接字符串,使用LocalDB这种轻量级的数据库引擎。修改web.config中的connectionStrings

<add name="MovieDBContext" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Movies.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />

生成增删改查

我们有了模型和数据库上下文,现在我们创建一个自带的增删改查。

添加控制器-->包含视图的MVC5控制器(使用EF)-->选择模型与上下文 --> 点击创建   

报错如:MVC+EF知识点_第1张图片

需要生成一下解决方案。

现在一个CURD的例子,就生成完毕了。

生成以后会在App_Data里面创建.mdf数据库。

 

模型的操作

整理一下模型里面所使用到的特性 Attribute。

命名空间:using System.ComponentModel.DataAnnotations;

MSDN: ComponentModel.DataAnnotations 

     ComponentModel.DataAnnotations.Schema 

[Display(Name = "时间")]
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }

Display 指定可本地化的字符串。就是显示的内容,配合@Html.DisplayNameFor。

DataType 指定要与数据字段关联的附加类型的名称。可以修改页面的输入验证,例如上面修改成时间,页面就变成时间空间。配合@Html.EditorFor。

DisplayFormat 指定 ASP.NET 动态数据如何显示数据字段以及如何设置数据字段的格式。显示格式与是否显示。配合@Html.EditorFor。

Required  指定需要数据字段值。界面上指定不为空等。

HttpPost 指定某个操作支持 POST HTTP 方法。配合@using (Html.BeginForm()){ }

ValidateAntiForgeryToken 表示用于阻止伪造请求的特性。配合@Html.AntiForgeryToken()

Bind 用于提供有关应如何进行模型绑定到参数的详细信息。防止黑客的一个机制。[Bind(Include = "ID,Title,ReleaseDate,Genre,Price")] Movie movie 只有Bind有的属性,才能使用。

主键 默认主键为实体的ID或者类名+ID,例如Status类,主键是ID 或 StatusID

视图的操作

先用一个修改页面的部分,来逐个讲解基础的页面内容。

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.ID)
    <div class="form-group">
            @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
            </div>
    </div>
    <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Save" class="btn btn-default" />
            </div>
     </div>
}

@using (Html.BeginForm()) 表单使用 POST 方法,并由视图的操作方法处理请求
@Html.AntiForgeryToken() 生成一个隐藏的窗体字段(防伪标记),在提交窗体时将验证此字段。配合ValidateAntiForgeryToken 
@Html.ValidationSummary() 返回验证信息。控制器返回 ModelState.AddModelError("", "错误"); 前端显示。
@Html.HiddenFor() 为由指定表达式表示的对象中的每个属性返回对应的 HTML 隐藏 input 元素。
@Html.LabelFor() 返回Label元素
@Html.EditorFor() 返回可以修改的元素,模型中DataType可定义类型,此处显示对应的类型。
@Html.ValidationMessageFor() 为由指定表达式表示的每个数据字段的验证错误消息返回对应的 HTML 标记。模型特性可以定义错误信息。
@Html.DropDownList() 返回单选 Select 元素
ViewBag 视图包,可以定义任意属性并在页面访问他,例如我定义一个下拉框,然后页面访问他。
//视图
@Html.DropDownList("movieGenre", "All")

//控制器
 ViewBag.movieGenre = new SelectList(GenreList);

 控件定义的名称会自动加载对应的ViewBag。

 

迁移模型更改

首先启用迁移,从程序包控制器输入:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext  选择数据库上下文。

此时会生成一个文件,Migrations-->Configuration.cs

可以在这里面设置数据库种子,当数据库生成以后会自动初始化数据

protected override void Seed(MVC.Models.MoiveDBContext context)
        {
            context.Movies.AddOrUpdate(i => i.Title,
               new Movie
               {
                   Title = "When Harry Met Sally",
                   ReleaseDate = DateTime.Parse("1989-1-11"),
                   Genre = "Romantic Comedy",
                   Rating = "PG",
                   Price = 7.99M
               }
          );

创建初始迁移,add-migration Initial。Initial是迁移文件的名称。

此时会生成一个迁移文件,Migrations-->*Initial。这个迁移文件会包含需要修改的地方。

public override void Up()
        {
            CreateTable(
                "dbo.Movies",
                c => new
                    {
                        ID = c.Int(nullable: false, identity: true),
                        Title = c.String(),
                        ReleaseDate = c.DateTime(nullable: false),
                        Genre = c.String(),
                        Price = c.Decimal(nullable: false, precision: 18, scale: 2),
                    })
                .PrimaryKey(t => t.ID);
            
        }
        
        public override void Down()
        {
            DropTable("dbo.Movies");
        }

 

创建数据库和种子。update-database。会创建数据库并自动执行Seed里面的方法。

 

你可能感兴趣的:(MVC+EF知识点)