ASP.NET MVC4+EF4.1系列之二實體Code First


前面我們已經能簡單的建立起MVC4項目了,接下來在項目中添加一個類庫,這個類庫是用來建EF用的,它承擔着MVC中Model層的作用。首先添加"ADO.NET實體數據模型",(我用的是簡體中文版)雖然建立很簡單但是照顧初學者就做了截圖。

這樣就完成了EF的創建

在前一篇已經說過通過一個小小的Demo去開始Code First。通過這個小例子進行簡單的CRUD,首先開始創建實體。

一、創建實體

我很喜歡EF的圖形化設計領域結構,實體設計如下圖:

很容易的看出來學生和成績記錄以下稱成績單和學生是1對多的關系,一個學生可以有多個成績記錄,因為每個課程都會有一個成績記錄,一個課程也可以有多次記錄,所以我們不難發現學生和課程是一個多對多的關系,一個學生有對個課程,當然一個課程也可以同屬於多個學生。

二、寫實體

關系已經理清,我們就要去寫這些實體。也許用過EF的大俠們都知道EF只要你將實體設計好,后台會自動生成類。但是在這里我不這樣做,我不讓它自動生成,我將EF的屬性,代碼生成策略改成“無”,如下圖所示:

大家注意畫了紅線的部分這樣EF就不會在后台自動給我們生成代碼了。那么大家會好奇,那我是不是要手動去寫這些類和關系映射。答案是"NO"。這就是微軟的強大了。我們用T4模板生成顯示的實體代碼。首先添加代碼生成項

在這里選中ADO.NET DbContext Generrator,也就是圖上畫紅線的選項,大家也許記得我在前面說我我們要用到EF4.1的一些新特性。這里開始體現了。經過以操作實體已經生成。
學生的實體:

namespace MVC4School.Model
{
    using System;
    using System.Collections.Generic;
    
    public partial class Student
    {
        public Student()
        {
            this.Performance = new HashSet<Performance>();
        }
    
        public System.Guid ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string StudentNum { get; set; }
        public System.DateTime CreateAt { get; set; }
        public string RecordTime { get; set; }
    
        public virtual ICollection<Performance> Performance { get; set; }
    }
}

 你很容易看到其中成績記錄屬性被virtual修飾,說明是延遲加載,這提高了性能,在EF中這個virtual不是必須的,不用visual在引用的是后也不會報錯只是為null,也許了解nhibernate的同志知道這個在nhibernate中是必須的沒有是會報錯的。

成績記錄的實體代碼如下:

namespace MVC4School.Model
{
    using System;
    using System.Collections.Generic;
    
    public partial class Performance
    {
        public System.Guid ID { get; set; }
        public string Score { get; set; }
        public string CreatAt { get; set; }
    
        public virtual Student Student { get; set; }
        public virtual Course Course { get; set; }
    }
}

 課程實體代碼如下:

namespace MVC4School.Model
{
    using System;
    using System.Collections.Generic;
    
    public partial class Course
    {
        public Course()
        {
            this.Performance = new HashSet<Performance>();
        }
    
        public System.Guid ID { get; set; }
        public string Name { get; set; }
        public string CreatAt { get; set; }
    
        public virtual ICollection<Performance> Performance { get; set; }
    }
}

 這樣這三個實體的代碼都完整的展現在我們的面前,但事實我們不用寫一行代碼,是不是很方便呢?(不要說我懶,有快捷的方式我為什么不用呢?)

三、creating the  Database Context

這個類主要將上面創建的類包含在其中,住要是指哪些實體包含在數據模型中,同時這個類指定我們創建的實體的映射關系,另一方面指定一些約束。

自動生成的代碼如下:

View Code
 1 namespace MVC4School.Model
 2 {
 3     using System;
 4     using System.Data.Entity;
 5     using System.Data.Entity.Infrastructure;
 6     
 7     public partial class SchoolModelContainer : DbContext
 8     {
 9         public SchoolModelContainer()
10             : base("name=SchoolModelContainer")
11         {
12         }
13     
14         protected override void OnModelCreating(DbModelBuilder modelBuilder)
15         {
16             throw new UnintentionalCodeFirstException();
17         }
18     
19         public DbSet<Student> Students { get; set; }
20         public DbSet<Course> Courses { get; set; }
21         public DbSet<Performance> Performances { get; set; }
22     }
23 }

這里我給一些簡單的解說

        public SchoolModelContainer()
            : base("name=SchoolModelContainer")
        {
        }

 "name=SchoolModelConter"這個指定了連接字符串,這個連接字符串在App.config配置文件中,你打開這個文件會看到這樣一段代碼:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="SchoolModelContainer" connectionString="metadata=res://*
/SchoolModel.csdl|res://*/SchoolModel.ssdl|res://*/SchoolModel.msl;
provider=System.Data.SqlClient;provider connection string='data source=.\SQLEXPRESS;
attachdbfilename="C:\Documents and
 Settings\Administrator.9682B89E07F644F\My Documents\SchoolModel.mdf";integrated security=True;connect timeout=30;

user instance=True;multipleactiveresultsets=True;App=EntityFramework'" 
providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

 這段連接字符串指定了數據庫類型和連接字符串,忘了和大家說了,EF支持大部分流行數據庫的。

這樣T4模板為我們做了所有的代碼編寫工作。下一節我給大家展示數據初始化和基本的CRUD。

未完待續……

 


免責聲明!

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



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