程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> entityframework學習筆記--005-給code first一個正確的解釋,entitycodefirst

entityframework學習筆記--005-給code first一個正確的解釋,entitycodefirst

編輯:關於.NET

entityframework學習筆記--005-給code first一個正確的解釋,entitycodefirst


在微軟官方關於ef7的介紹中強調,ef7將捨棄database first、model first,只保留code first的使用。這引起了很多人的擔憂,擔憂源自對code first的錯誤理解。因為很多人認為code first是區別於database first與model first的第三種方式,其實這是錯誤的理解。其實code first是替代前兩種方式的解決方案。換句話來說,Code First 不是相對 Database First 和Model First的第三種方式,而是一種可以替代EDMX文件格式的方案。從概念上講,Code First 同時支持Database First和Model First工作方式。 這的確讓人感到混亂,我們取錯了名字。 或許叫它“基於代碼建模(code-base modeling)”會更清晰些。這裡有一篇關於ef7的介紹文檔:https://msdn.microsoft.com/zh-cn/magazine/dn890367.aspx

1.首先為你的項目安裝上entityframework,然後右鍵你的項目,添加兩個實體類文件,類文件信息如下:

 1 public class Class
 2     {
 3         public int Id { get; set; }
 4         public string Name { get; set; }
 5         public virtual List<Student> Students { get; set; }
 6         public Class()
 7         {
 8             Students = new List<Student>();
 9         }
10     }
 1 public class Student
 2     {
 3         //[Key]
 4         public int Id { get; set; }
 5         public string Name { get; set; }
 6         public int ClassId { get; set; }
 7 
 8         //[ForeignKey("ClassId")]
 9         public virtual Class Class { get; set; }
10     }

1.2 在添加一個繼承自DbContext的類,DbContext類是ef的數據訪問核心。類信息如下:

 1 public class MyEfRecipesContext:DbContext
 2     {
 3         public MyEfRecipesContext()
 4         {
 5             //Database.SetInitializer(new CreateDatabaseIfNotExists<MyEfRecipesContext>());
 6         }
 7         public DbSet<Student> Students { get; set; }
 8         public DbSet<Class> Classs { get; set; }
 9 
10         protected override void OnModelCreating(DbModelBuilder modelBuilder)
11         {
12             //這裡可以用於模型創建前的配置修改
13         }
14     }

上圖中的注釋代碼是可以省略的,因為ef的默認配置就是這樣。當然你可以手動更改配置信息。在ef中有一個原則“約定大於配置”,約定其實也就是默認配置,意思就是說ef中的約定最好不要主動去修改它。下面是ef的一些默認約定:

(1) 數據庫映射:Code First 默認會在本地的SQL Expression數據庫中建立一個和DbContext的子類的全名相同的數據庫,全名指的是命名空間加上類名。

(2)表映射:Code First 默認會按照類型名復數建立數據表,比如說Student類對應的表名就叫Students.

(3)列映射:Code First 默認會按照類中的屬性名建立column,它還有默認的數據類型映射習慣,int會映射為interger,string會映射為nvarchar(max),decimal會映射為decimal(18,2)。後邊會介紹如何更改column的名稱,類型以及其他特性。

(4)主鍵映射:Code First 默認會在類的屬性中需找名字為Id或類型名稱+Id的int類型的屬性作為主鍵,並且是自增字段。這些也是可以改的。

1.3 在App.config中添加配置文件,如果是Web程序配置文件則是Web.config,這個不用介紹了吧。連接字符串信息如下:

  <connectionStrings>
    <add name="MyEfRecipesContext" connectionString="Data Source=.;Initial Catalog=myefrecipes;User Id=sa;Password=renjing2000;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
  </connectionStrings>

2.示例代碼。新增與查詢,輸出見圖5-1:

 1 using (MyEfRecipesContext db = new MyEfRecipesContext())
 2             {
 3                 Class c1 = new Class() { Name = "class1" };
 4                 Student s1 = new Student() { Name = "rj1", Class = c1 };
 5                 Student s2 = new Student() { Name = "rj2", Class = c1 };
 6 
 7                 db.Students.Add(s1);
 8                 db.Students.Add(s2);
 9                 int i = db.SaveChanges();
10 
11                 Console.WriteLine("id\t姓名\t班級");
12                 foreach (var item in db.Students)
13                 {
14                     Console.WriteLine("{0}\t{1}\t{2}",item.Id,item.Name,item.Class.Name);
15                 }
16             }

圖5-1

3.運行程序後,生成的表結構如圖5-2。可以發現Students表月Classes表生成了“一對多”的關系,和我們的預期一樣。“__MigrationHistory”是ef自動生成的一張表,主要用於ef的一些配置信息,可以不用關心。

 

圖5-2

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved