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

来源:http://www.cnblogs.com/renjing/archive/2016/12/01/codefirst.html
-Advertisement-
Play Games

在微軟官方關於ef7的介紹中強調,ef7將捨棄database first、model first,只保留code first的使用。這引起了很多人的擔憂,擔憂源自對code first的錯誤理解。因為很多人認為code first是區別於database first與model first的第三種 ...


在微軟官方關於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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 直接上代碼,包各位看客能用!!! 1.首先請求參數的封裝 2.HttpWebRequest 封裝 HttpUploadClient類中兩個Execute2,參考網上,大都用第一個,如果上傳小文件沒問題,要是比較大(百兆以上)就會記憶體溢出,然後就用流方式。思路是一樣的 3.調用示例: 4.介面服務後臺 ...
  • 第一步:訪問:https://www.microsoft.com/zh-cn/software-download/windows10ISO/ 預設就只能下載win10,這怎麼行呢。巨硬程式員貌似沒做服務端驗證。。第二步:瀏覽器控制台輸入以下js代碼: 效果: 需要下載的就快下。指不定哪天就被封了。 ...
  • 目前chrome是我在實現webdriver時運行最穩定的瀏覽器,如何利用webdriver打開多個標簽頁和鏈接呢,到處查找得到的往往只是如何打開標簽頁。打開標簽頁很簡單,chrome瀏覽器打開標簽頁的快捷鍵是ctrl+t,那把ctrl+t的按鍵事件傳入即可,很多種實現方式,以下只列出兩種:1:Ac ...
  • 本文介紹應用程式中添加書籍的保存功能,涉及兩個功能“新增”與“修改”。異常處理的小結。 ...
  • .net初學者,有錯誤歡迎指正。大家共同進步 Response 輸出數據 Reponse對象和Request對象組成了一對發送,接受數據的對象。 發送信息:Reponse.Write("字元串"); Reponse對象最常用的方法是Write,用於向瀏覽器發送信息。使用Write方法輸出的字元串會被 ...
  • 定義一個靜態類,類中定義靜態方法,方法中參數類型前邊加上this修飾符,即可實現對this所指向類的擴展。 有點類似js中通過類的原型去擴展方法,類的實例對象就可以通過對象.方法名去調用 示例如 ...
  • 示例代碼: is a way to use packages that were not designed for that framework. Basically you tell it "Use those targets even though they don't seem to be s ...
  • 在C#中有多個線程同時對某個變數進行操作的時候,我們應該使用原子操作,防止多線程取到的值不是最新的值。 本文介紹了多線程中使用原子操作與不使用原子操作的不同,以及使用原子操作與使用lock鎖來保障多線程執行的唯一性的性能優劣。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...