• 结合EF5.0讲MVC4(二)为先前程序添加查询及主外键关系


    本节导航

    1、补充

    2、添加对电影的查询

    3、添加导演表、创建导演表和电影表的主外键关系

    4、Model属性应用

    5、持久对象的生命周期

    进入目录   下载源码   下载视频

    一、补充

    1、EF对主键的处理

      我们在上一节中的Movie实体中并没有设置ID列为主键列,但是在数据表创建完成之后我们看到ID列成为了主键。这是因为EF会对实体类中ID进行检索,对于出现ID之后,会自动设置ID为主键,如果ID为int类型,则被设置成自增长的主键列。同样,以实体类名+ID形式的组合名称,EF同样也会将其设置成主键列,加入我们Movie中没有ID,而是MovieID,则MovieID就会被设置成主键。同时,我们也可以在ID或者MovieID上添加字段属性来标识它是主键,关键字是[Key]。

    [Key]
    public int ID { get; set; }

    [Key]需要添加命名空间System.ComponentModel.DataAnnotations。

    2、对于资源的释放

      在第一节的内容中有人留言

    lz 好像要释放资源把 你的好像都没有释放

      在EF处理中,创建的所有连接都在执行完一个Action之后自动Dispose掉了。原因是在Controller中重写了基类的Dispose方法。在执行完Action之后,会自动调用这个重写后的方法,从而达到释放的目的。

      

    protected override void Dispose(bool disposing)
            {
                db.Dispose();
                base.Dispose(disposing);
            }

    二、添加对电影的查询

    先看一下效果

    首先我们要对Index页面进行修改,加入如下代码:

    @using (Html.BeginForm())
        {
            <p>Genre:@Html.DropDownList("Genre","All")
                Title:@Html.TextBox("MovieTitle")<br />
                <input type="submit" value="Search" />
            </p>
        }

    我使用了Html.DropDownList()来显示一个下拉框,同时使用Html.TextBox()等待输入Title。在下拉列表中,我给它起名叫做“Genre”,同时默认值是"All"。

    接下来,修改MovieController中的Index方法。

     1 public ActionResult Index(string Genre, string MovieTitle)
     2         {
     3             var genre = from t in db.Movie
     4                         orderby t.Genre
     5                         select t.Genre;
     6             var GenreList = new List<string>();
     7             GenreList.AddRange(genre.Distinct());
     8             ViewBag.Genre = new SelectList(GenreList);
     9             var movies = from t in db.Movie
    10                          select t;
    11             if (!string.IsNullOrEmpty(MovieTitle))
    12             {
    13                 movies = movies.Where(m => m.Title.Contains(MovieTitle));
    14             }
    15             if (string.IsNullOrEmpty(Genre))
    16             {
    17                 return View(movies);
    18             }
    19             else
    20             {
    21                 return View(movies.Where(m => m.Genre == Genre));
    22             }
    23 
    24         }

      1、获取Movie表中所有的流派并将检索到的信息放置在List当中。通过ViewBag为页面中的名字叫做"Genre"的下拉框赋值。

      2、获取所有的电影信息,如果传入的Title不为空,就检索包含Title内容的电影。

      3、如果没有选择流派,直接返回movies,如果选择了流派,就在movies中检索包含这个流派的信息并返回。

    所有完成之后,就出现了上面的效果。

    三、添加导演表,创建导演表和电影表的主外键关系

    首先创建导演表,在这里起名Author,在Models下添加。内容有:

    public class Author
        {
            public int AuthorID { get; set; }
            public string AuthorName { get; set; }
    
            public virtual ICollection<Movie> Movie { get; set; }
        }

    显而易见,一个导演对应多部电影,一对多关系。接下来修改先前的Movie类,内容如下:

    public class Movie
        {
            public int ID { get; set; }
            public string Title { get; set; }
            public DateTime ReleaseDate { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
            public string Rating { get; set; }
    
            public int AuthorID { get; set; }
    
            public virtual Author Author { get; set; }
        }

    我在Movie中添加了AuthorID和一个Author类型的Author。AuthorID在这里就成为了外键。

    修改完Models,在母版页上添加对Author控制器的导航链接。运行看一下效果。

    我们在Author中添加上“成龙”,“冯小刚”。

    接下来修改Movie的Index页面。要把这部电影的导演给显示出来。如图:

    修改的代码是:

    我想,写到这里大家就知道我为什么在Movie实体里添加public virtual Author Author{get;set;}了。

    然后,修改MovieController。

    public ActionResult Index(string Genre, string MovieTitle)
            {
                var genre = from t in db.Movie
                            orderby t.Genre
                            select t.Genre;
                var GenreList = new List<string>();
                GenreList.AddRange(genre.Distinct());
                ViewBag.Genre = new SelectList(GenreList);
                var movies = from t in db.Movie
                             select t;
                if (!string.IsNullOrEmpty(MovieTitle))
                {
                    movies = movies.Where(m => m.Title.Contains(MovieTitle));
                }
                if (string.IsNullOrEmpty(Genre))
                {
                    return View(movies.Include(m => m.Author));
                }
                else
                {
                    return View(movies.Where(m => m.Genre == Genre).Include(m=>m.Author));
                }
    
            }

    接下来修改Create页面。

    以及Create方法:

    四、持久对象的生命周期

    以Movie为例,在MovieController中的Create、Edit、DeleteAction中db.SaveChanges();方法的前后添加如下代码,然后加入断点进入调试,就可以明显的看出变化。

    EntityState statebefore = db.Entry(Movie).State;
    EntityState stateafter = db.Entry(Movie).State;

    如Create中EntityState的变化是 Detached--->Added---->Unchanged,Edit中的变化是Detached--->Modified---->Unchanged,Delete中的变化是:Unchanged--->Deleted---->Detached。

    五、Model属性应用

      见这里




    文章作者:禁止吸烟

    道本无话可说,皆当全力以赴。

    博客地址:http://www.cnblogs.com/outtamyhead/

  • 相关阅读:
    Redis
    Redis入门
    C#编程--语句(分支语句)
    C#编程--运算符
    C#编程--输入和输出
    C#编程进制转换
    C#语言课程11月10日
    C#语言课程11月9日
    C#语言课程11月7日
    C#语言课程11月6日
  • 原文地址:https://www.cnblogs.com/outtamyhead/p/2933361.html
Copyright © 2020-2023  润新知