MVC3+EF4.1學習系列(一)-------建立EF4.1 code first的第一個執行個體

來源:互聯網
上載者:User

標籤:重寫   增刪改查   lin   導航   總結   學生   lex   compact   elb   

基於EF4.1 code first 簡單的CRUD  園子中已經有很多了 ~~ 真不想再寫這個了 可是為了做一個完整的小demo 從開始 到後面的一些簡單重構 還是決定認真把這個寫出來

爭取寫些別人沒寫到的東西~~ 好了 開始~~

 

這次要做的是個學校管理的demo(通俗些)

 

 先建一個MVC3的應用程式  因為我們是code first 所以 開始建立實體類

一.建立Model

學生和學產生績登記表是一對多的關係  一個學生可以有多次登記 (因為有多個課程)  一個課程也可以有多個登記   可以看出 其實就是 學生和課程 存在一個多對多的關係

為什麼這麼建立模型呢?這節主要不是討論關係 關係這個會放到  第三節來討論~~

現在開始建立學生的實體類

using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
public class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
}

在這裡面 這個StudentID將被預設的設為主鍵  EF將會預設的給名字為ID的或者帶ID的設定為主鍵

Enrollments是一個導覽屬性  將做為外鍵    導覽屬性定義為virtual 以便於實現消極式載入 

  接下來 建立登記錄入表(關係表)的實體類 

using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
public class Enrollment
{
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public decimal? Grade { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
}

這裡面 我們的成績是可空類型     學生實體有多個 Enrollment 而Enrollment有一個學生實體的導覽屬性 這裡面 我們既有學生ID 又有學生實體屬性 我們會擔心 會不會產生兩個呢StudentID?不用擔心 EF很聰明 在關係表裡 只有一個studentID

接下來就是建立課程實體了

 

using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
public class Course
{
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
}

 

OK了 實體建立好了 接下來 我們要建立一個 資料庫上下文

二.Creating the Database Context

這個類主要是把上面建立的實體類包含再裡面  指定哪些實體類包含在我們的資料模型中 還有 這個類可以指定我們的映射關係 還可以指定一些產生的約束關係總之 很有用的

這裡面 我們先建立一個DAL的檔案夾 然後在下面建立一個類 叫做SchoolContext  並且繼承DbContext

View Code

詳細的解釋下這裡

 private readonly static string CONNECTION_STRING = "name=WlfSys_EFCF_ConnString";
 public SchoolContext()
: base(CONNECTION_STRING)//不寫這個 預設的就是SchoolContext
{

}

上面這裡是配置連接字串  預設的就是SchoolContext 即你這個context的名字

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除複數表名的契約

modelBuilder.Conventions.Remove<IncludeMetadataConvention>();//防止黑幕交易 要不然每次都要訪問 EdmMetadata這個表

再重寫的這個方法裡 我們可以移除一些契約  還可以設定資料庫映射關係  常用的移除資訊 都寫在裡面了

三.設定連接字串

 <connectionStrings>
<add name="WlfSys_EFCF_ConnString"
providerName="System.Data.SqlClient" connectionString="Data Source=.;Initial Catalog=WLFSchool;Integrated Security=True;Pooling=False" />
</connectionStrings>

我們的這個名字 和上面設定的一直~~(那個英文部落格裡用的是 SQL Server Compact database 但為了讓項目貼近實際 我這裡用SQL2005)

四.資料庫資料初始化

在DAL下 建立一個類 SchoolInitializer  繼承自 DropCreateDatabaseIfModelChanges<SchoolContext>  這個類主要實現 資料庫資料初始化 方便測試~~

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;//記得引用命名空間
using ContosoUniversity.Models;


namespace ContosoUniversity.DAL
{
public class SchoolInitializer : DropCreateDatabaseIfModelChanges<SchoolContext>
{


protected override void Seed(SchoolContext context)
{
var students = new List<Student>
{
new Student { FirstMidName = "Carson", LastName = "Alexander", EnrollmentDate = DateTime.Parse("2005-09-01") },
new Student { FirstMidName = "Meredith", LastName = "Alonso", EnrollmentDate = DateTime.Parse("2002-09-01") },
new Student { FirstMidName = "Arturo", LastName = "Anand", EnrollmentDate = DateTime.Parse("2003-09-01") },
new Student { FirstMidName = "Gytis", LastName = "Barzdukas", EnrollmentDate = DateTime.Parse("2002-09-01") },
new Student { FirstMidName = "Yan", LastName = "Li", EnrollmentDate = DateTime.Parse("2002-09-01") },
new Student { FirstMidName = "Peggy", LastName = "Justice", EnrollmentDate = DateTime.Parse("2001-09-01") },
new Student { FirstMidName = "Laura", LastName = "Norman", EnrollmentDate = DateTime.Parse("2003-09-01") },
new Student { FirstMidName = "Nino", LastName = "Olivetto", EnrollmentDate = DateTime.Parse("2005-09-01") }
};
students.ForEach(s => context.Students.Add(s));
context.SaveChanges();

var courses = new List<Course>
{
new Course { Title = "Chemistry", Credits = 3, },
new Course { Title = "Microeconomics", Credits = 3, },
new Course { Title = "Macroeconomics", Credits = 3, },
new Course { Title = "Calculus", Credits = 4, },
new Course { Title = "Trigonometry", Credits = 4, },
new Course { Title = "Composition", Credits = 3, },
new Course { Title = "Literature", Credits = 4, }
};
courses.ForEach(s => context.Courses.Add(s));
context.SaveChanges();

var enrollments = new List<Enrollment>
{
new Enrollment { StudentID = 1, CourseID = 1, Grade = 1 },
new Enrollment { StudentID = 1, CourseID = 2, Grade = 3 },
new Enrollment { StudentID = 1, CourseID = 3, Grade = 1 },
new Enrollment { StudentID = 2, CourseID = 4, Grade = 2 },
new Enrollment { StudentID = 2, CourseID = 5, Grade = 4 },
new Enrollment { StudentID = 2, CourseID = 6, Grade = 4 },
new Enrollment { StudentID = 3, CourseID = 1 },
new Enrollment { StudentID = 4, CourseID = 1, },
new Enrollment { StudentID = 4, CourseID = 2, Grade = 4 },
new Enrollment { StudentID = 5, CourseID = 3, Grade = 3 },
new Enrollment { StudentID = 6, CourseID = 4 },
new Enrollment { StudentID = 7, CourseID = 5, Grade = 2 },
};
enrollments.ForEach(s => context.Enrollments.Add(s));
context.SaveChanges();

}
}
}

這樣還沒有完 還要再 Global.asax 下的Application_Start()加上如下代碼

 Database.SetInitializer<SchoolContext>(new SchoolInitializer());

五.建立控制器

 建立好後添加

    private SchoolContext db = new SchoolContext();

再在Index方法下添加得到所有學生的方法

public ViewResult Index()
{
return View(db.Students.ToList());
}

六.添加視圖(小談MVC的 DISPLAY)

@model IEnumerable<ContosoUniversity.Models.Student>

@{
ViewBag.Title = "Students";
}

<h2>Students</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th></th>
<th>Last Name</th>
<th>First Name</th>
<th>Enrollment Date</th>
</tr>

@foreach (var item in Model) {
<tr>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.StudentID }) |
@Html.ActionLink("Details", "Details", new { id=item.StudentID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.StudentID })
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.FirstMidName)
</td>
<td>
@Html.DisplayFor(modelItem => item.EnrollmentDate)
</td>
</tr>
}

</table>

好了 視圖添加完了 這裡面 我們用了 Html.DisplayFor  剛看到這個時 總是不明白這個到底顯示什麼 還有實體類上 總是加上display(name="")這樣的特性 但是又和這個沒關係 讓我很鬱悶

查了MSDN和相關資料 終於明白  Html.DisplayFor 可以算是顯示模版 顯示實體類的特性[DataType(DataType.Password)] 這樣顯示的就是密碼框   而 display(name="")這樣的特性  則是讓 Html.LabelFor()去顯示的  display的具體的 可以看下這個文章 介紹的不錯 display模版詳細介紹

七.運行環境 查看結果

 

大家一定很關心資料庫的產生什麼樣子滴~~

EdmMetadata 資料庫記錄個版本對照 可以不要 在契約裡有刪除~~用站長dudu的話 防止黑幕交易

八.總結

很簡單的建立一個EF4.1 代碼優先的小例子 沒什麼難度~~ 但還是認真的寫了下來 好累哦

下一節 講基本的增刪改查操作 以及中間發生的狀態的變更

MVC3+EF4.1學習系列(一)-------建立EF4.1 code first的第一個執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.