zoukankan      html  css  js  c++  java
  • MVC自学系列之四(MVC模型Models)

    ASP.NET MVC 提供了一系列工具和特性去使用仅仅定义的对象模型。你可以坐下来好好思考你将要解决的问题,并且写好C#类,当你准备好时就可以使用MVC提供的工具去为每一个实体构建标准的index、create、edit、delete方法,这个构建的工作就称为“基架”(Scaffloding)。

    所谓“基架”就是MVC提供的能够在应用程序中产生你所需要的增删改查(CURD)的基础功能的模板代码。

    EF

    1、通过EF(EninityFramework),开发人员可以使用model-first、schema-first、code-first几种模式。

    2、code-first的约定

    ①如果你想要在数据库中存储类型为A的实体对象,EF会认为你想要在数据库中创建一个名为A的表。如果你的对象中有一个属性名为ID,那EF会把这个ID属性作为表A的主键并且是自动增长的。EF还有一些外键关系、数据库名等等,这些约定代替了你过去在ORM框架中的映射和配置。如果你需要使用已存在的数据库,那么你可能需要提供映射元数据。

    ②使用EF的code-first,到达数据库的途径就是让你的类继承自DbContext类,这样继承类就将会有一个或多个DbSet<T>类型的属性,每一T代表着你想要保存的类型。

    ③加载相关联对象--延迟加载

    public ViewResult Index()
       {
           var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);
           return View(albums.ToList());
       }

         在Index中的Include方法使用即时加载模式去加载与album对象相关联的atrist和genre信息。即时加载模式试图通过使用单一查询去加载所有的数据。

        另一种策略是EF的延时加载模式,EF仅加载LINQ语句中的主要对象(album),而不会加载相关联的属性Genre和Artist,直到需要使用它们的时候才进行加载。但是对于去加载album信息,延时加载会进行多一次的查询,比如有100条album信息,却要进行101次的查询,这就是人们所谓的N+1问题,当使用ORM框架时这是需要面对的问题,延时加载很方便,但是有潜在的额外消耗。

    3.用EF生成数据库

    ①EF的code-first方式尽可能得采用约定大于配置的方针,如果你不去配置从模型到数据库表、列特定的映射,那么EF就用约定去创建数据库表;如果你不想配置特殊的数据库连接,EF会采用约定的配置。

    ②初始化你的数据库数据

    当你调用EF的Database类静态SetInitializer方法时,可以选择以下两个方案中的一种,其一是DropCreateDatabaseAlways,其二是DropCreateDatabaseIfModelChanges

    4.初始化你的数据库数据(Seeding to database)

    你可以继承自DropCreateDatabaseAlways类并且重写Seed方法

    protected override void Seed(MusicStoreDB context)
            {
                context.Artists.Add(new Artist { Name = "罗志祥" });
                
                context.Genres.Add(new Genre { Name="摇滚"});
    
                context.Albums.Add(new Album
                {
                    Arist = new Artist { Name = "周杰伦" },
                    Genre = new Genre { Name="中国风"},
                    Price = 25.5m,
                    Title = "依然范特西"
                });
    
                base.Seed(context);
            }

    然后再Global.asax文件中的Application_Start()方法中添加

    Database.SetInitializer(new MusicStoreDbInitializer());

    5.完成你的应用程序初始化仅需要三步骤

    ①完成你的模型类

    ②利于“基架”构建你的控制器(controller)和视图(Views)

    ③选择你的数据库初始化策略

      Edit Action

    [HttpPost]
    public ActionResult Edit(Album album)
    {
       if (ModelState.IsValid)
       {
           db.Entry(album).State = EntityState.Modified;
           db.SaveChanges();
           return RedirectToAction("Index");
       }
       ViewBag.GenreId = new SelectList(db.Genres, "GenreId",
                                        "Name", album.GenreId);
       ViewBag.ArtistId = new SelectList(db.Artists, "ArtistId",
                                        "Name", album.ArtistId);
       return View(album);
    }

    这个方法的职责就是接受用户编辑过后传回来的Album实体;如果实体状态有效,我们把dbContext的状态改为修改模式,最后SaveChanges()就将新的实体对象保存到了数据库中。

      模型绑定

    1.你知道编辑视图将要发送一些值为服务器,如果你在服务器端想要接受这些值,你可能会从request中直接获得你想要的值,比如

    [HttpPost]
    public ActionResult Edit()
    {
       var album = new Album();
       album.Title = Request.Form["Title"];
       album.Price = Decimal.Parse(Request.Form["Price"]);
    }

    这样当有一两个接受值还好,假如有四五个或者更多时,这样的操作就有点麻烦了;

    2.MVC提供的模型绑定功能,如果你input输入的name名与属性名相匹配时;MVC运行时会为你的带参action方法提供默认模型绑定功能,它能够自动将回传回来的值转化为album正确的属性类型。换句话来说,模型绑定当发现Album有一个Title的属性,它就会在请求值中寻找名为Name为"Title”的值

    3.确认你的模型绑定

    当你的方法有参数时,模型绑定就能够确认如何工作了;你仍然需要去确认模型绑定时在你的controller中使用的是UpdateModel还是TryUpdateModel模式,它们之间的区别是:当模型绑定出错或是模型无效时,UpdateModel会抛出异常,而TryUateModel;就像intParse和intTryParse类型;

    为易维护、易扩展、易复用、灵活多样而努力~~
  • 相关阅读:
    SQL补充
    SQL练习题
    HDU 2907
    Codeforces 814D
    Codeforces 814C
    Codeforces 1004D
    Codeforces 1004E
    CodeForces 909F
    CodeForces 909E
    CodeForces 909D
  • 原文地址:https://www.cnblogs.com/SpringDays/p/3236538.html
Copyright © 2011-2022 走看看