結合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屬性應用

  見這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM