今日重點:CodeFirst -DatabaseFirst-jscoding-LINQ

∎ CodeFirst:先有程式,後產生資料庫

Create the Application — Create the Model — Create a Context — Reading & Writing Data — Where’s My Data? — Dealing with Model Changes — Data Annotations — Fluent API

補充:Console Class
表示主控台應用程式 (Console Application) 的標準輸入、輸出和錯誤資料流。 這個類別無法被繼承。

▸ Create the Application

Console Application
Enter CodeFirstNewDatabaseSample as the name

備註:List<Post> 由部落格文章形成的清單

▸Create the Model

CodeFirst:程式碼先,資料庫後

語法:
public class Blog { public int BlogId { get; set; } public string Name { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; }
public int BlogId { get; set; } public virtual Blog Blog { get; set; }
}

補充:C# get & set 存取子
get 可以形容成 “提供”,要返回結果
可以透過 get 存取子,將字串進行判斷、處理…. 再返回結果

set 則可形容成 “設定”,多數在處理計算及邏輯處理
set含有特殊的keyword: value,當有值傳入時,都會存入value中

▸Create a Context

Project –> Manage NuGet Package

Select the Online tab
Select the EntityFramework package
Click Install

安裝EntityFramework 實體模型

EntityFramework 是微軟以 ADO.NET 為基礎所發展出來的物件關聯對應 (O/R Mapping) 解決方案 。

將產生packages.config:紀錄安裝歷程,並完成參用
及產生C://packages資料夾

加入using System.Data.Entity;
加入語法
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}

完成畫面:

補充:DbContext
Entity Framework 是 .NET 跟資料庫溝通好用的 Object-Relational Mapper (O/RM) 框架,DbContext 必須具有執行個體的DbContextOptions才能執行任何工作。

Context 環境值,容器。
BloggingContext可類比資料集,列管多個部落格及文章。

物件-資料-屬性
Blogs,Posts屬性

▸ Reading & Writing Data

加入語法至主程式:造一個物件存入資料庫
using (var db = new BloggingContext())
{ // Create and save a new Blog
Console.Write(“Enter a name for a new Blog: “);
var name = Console.ReadLine();
var blog = new Blog { Name = name }; //造一個Blog加到Blogs資料集裡面
db.Blogs.Add(blog); //存入db資料內容類別裡
db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b;

Console.WriteLine(“All blogs in the database:”);
foreach (var item in query)
{
Console.WriteLine(item.Name);
} //將資料列成清單
Console.WriteLine(“Press any key to exit…”);
Console.ReadKey();
}

執行畫面:

至SQL Server驗證:Where’s My Data?

小結:
新增專案
1. 在Console Application的標準輸入、輸出和錯誤資料流內編程
2. 於[ Program.cs]內,定義SQL資料表模型Blog和Post
3. 於[Project –> Manage NuGet Package],安裝EntityFramework 實體模型
新增內容
4. 建立與資料庫溝通框架:
using System.Data.Entity;,加入語法 public class BloggingContext : DbContex
讀寫資料
5. 於[ Program.cs]內,主程式內加入指令,執行後畫面輸入資料
6. 即完成在SQL內新增資料表和資料!

∎ DatabaseFirst:先有資料庫,後程式設計

目標:新增一個資料庫,建立兩張資料表

▸Create an Existing Database

View -> Server Explorer
Right click on Data Connections -> Add Connection…

[VS] 建立資料庫( Existing Database)
檢視>伺服器總管 > 資料連接 > 選擇資料來源:SQL_Server

加入連接 > 連線至資料庫

至SQL Server驗證:已建立 DatabaseFirst.Blogging資料庫

加入兩張資料表

執行後畫面輸入資料,並儲存進SQL

SQL儲存完成畫面

▸Create the Application

建立專案>主控台應用程式

加入>新增項目>Data>ADO.NET實體模型

補充:實體資料模型
實體資料模型 (EDM) 是描述資料結構的概念集,不論其預存形式為何。

模型:EF Designer

備註
- 不把連線字串寫死,而是寫成設定檔
- 將App.Config中的連接設定儲存為 的用意?
重要性:連線字串為資料類別的名稱,程式設計會使用到

注意:必須勾選產生的物件名稱複數化或單數化
用意:單數負數正規化,避免程式設計過程中的混肴

思考:檢視BloggingModel各個程式碼

▸Reading & Writing Data

加入語法至主程式:造一個物件存入資料庫
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write(“Enter a name for a new Blog: “); var name = Console.ReadLine();
var blog = new Blog { Name = name }; db.Blogs.Add(blog); db.SaveChanges();
// Display all Blogs from the database
var query = from b in db.Blogs orderby b.Name select b;
Console.WriteLine(“All blogs in the database:”); foreach (var item in query) { Console.WriteLine(item.Name); }
Console.WriteLine(“Press any key to exit…”); Console.ReadKey();
}

至SQL Server驗證:已在 DatabaseFirst.Blogging資料庫內新增一筆資料

小結:
設定已存在資料庫(內容)
1. 於[伺服器總管 > 資料連接]內,建立資料庫連接
2. 於已建立連接的連結上右鍵,新增查詢
3. 於[ SQLQuery]內,加入新增資料表指令,執行後畫面輸入資料

新增專案
4. 在Console Application的標準輸入、輸出和錯誤資料流內編程
5. 加入[新增項目>Data內]的ADO.NET實體模型]
6. 選擇來自資料庫的EF Designer
7. 設定連接屬性
8. 將App.Config中的連接設定儲存為:名稱Context
9. 模型中包含哪些資料庫物件,將產生的物件名稱單數或複數化

讀寫資料
10. 於[ Program.cs]內,主程式內加入指令,執行後畫面輸入資料
11. 即完成在SQL內新增資料表和資料!

∎ 查詢資料

新增專案 > Windows Forms

完成畫面

新增一個Button及DataGridVeiw

寫法一 :
var query = from o in db.Products select o ;
//query 查詢介面

dataGridView1.DataSource = query.ToList();
//var query這段查詢程式,執行後得到成果,轉換成清單

完成畫面:

寫法二 :
var query = from o in db.Products
where o.UnitPrice >= 50
&& o.ProductName.IndexOf(“A”) >= 0
orderby o.UnitPrice descending
select o;
//query 查詢介面

dataGridView1.DataSource = query.ToList();
//var query這段查詢程式,執行後得到成果,轉換成清單

完成畫面:

思考:此處的功能,對比前三堂課程所學應用

∎ 消極式載入 (Lazy Loading)

當db.Content 有資料,就不到SQLServer重新載入資料

∎ 透過C#存取SQL資料

待補:查C# test0218_EDM檔案

▸儲存資料

▸修改資料

▸新增資料

∎ LINQ 語言整合查詢

▸ var

根據類別造物件的演進寫法:
1:先建物件再補屬性值
2:在建立物件同時指定屬性
3:建立多個物件屬性.形成陣列
4:將陣列形成清單
5:建立物件同時,建立陣列同時,指定屬性
6:簡化上式
7:跳過類別階段直接造物件,
由var,開發環境決定型別(自動產生類別),根據等號右邊決定型別

注意:ID語法上要相同一致,以第一列為標準
例如:
new { cityID = “TC”, cityName = “TaiChung” },
new { cityID = “TP”, cityName = “TaiPei” }

寫法演進
private void button1_Click(object sender, EventArgs e) {
Employee emp = new Employee();
emp.id = 1;
emp.name = “name 1”;

Employee emp2 = new Employee() { id = 2, name = “Derek Jeter” };

var emp7 = new Employee() { id = 7, name = “Jeremy Lin” };

//Employee[] empList = new Employee[3];
//empList[0] = emp;
//empList[1] = emp2;
//empList[2] = emp7;

Employee[] empList = new Employee[] {
new Employee() { id = 1, name = “Taiwan №1” },
new Employee() { id = 2, name = “Derek Jeter” },
new Employee() { id = 7, name = “Jeremy Lin” }
};

button1.Text = empList[2].name;

}

查看型別GetType()
private void button2_Click
(object sender, EventArgs e) {
var emp10 = new { id = 10, LastName = “Messi”, country = “A.” };
button2.Text = emp10.GetType().ToString();
this.Text = emp10.LastName;
}

【最終完成寫法】
private void button3_Click
(object sender, EventArgs e)
{
var cityList = new [] {
new { cityID = “TC”, cityName = “TaiChung” },
new { cityID = “TP”, cityName = “TaiPei” }
};
button3.Text = cityList[1].cityName;

}

▸ LINQ_Object

(處理對象不是資料庫)
演進寫法:

寫法一
定義dataList資料源,運用var query程式,將資料呈現於Client端 。

說明:
- var query為查詢資料的程式
- from 物件參考 in 集合項
宣告from o放在dataList裡面,o是dataList裡面的東西
- foreach從query資料內逐筆取出data,構成清單

new string[]為資料來源
var query為資料查詢程式
MessageBox.Show(item)為Client端

語法:
string[] dataList = new string[] {“a1”,”b”,”a2",”c” };
var query = from o in dataList
select o;
foreach(var item in query)
{
MessageBox.Show(item);
}

完成畫面:

寫法二:遞減排序

說明:
-
orderby _ascending 遞減排序

- 補充:比較字串大小:
if(string.Compare(s1,s2))
概念:s1-s2,>0:s1大於s2,<0:s1小於s2

語法:
//var query = from o in dataList
// orderby o ascending
// select o;
var query = from data in dataList
orderby data descending
select data;
foreach (var item in query)
{
MessageBox.Show(item);
}

完成畫面:

-The End-

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store