> For the complete documentation index, see [llms.txt](https://johch3n611u.gitbook.io/c50108/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://johch3n611u.gitbook.io/c50108/ju-li-cheng-bei/201904/2019-0419.md).

# 2019/0419/主頁、Webform ADO.NET Entity Fromwork 增刪修實作&第五次專題報告

MVC前主頁webform ADO.NET Entity Fromwork增刪修實作
---------------------------------------

{% embed url="<https://www.google.com/search?q=entityfromwork&oq=entityfromwork&aqs=chrome..69i57.440j0j9&sourceid=chrome&ie=UTF-8>" %}

{% embed url="<https://www.google.com/search?q=entityfromwork&oq=entityfromwork&aqs=chrome..69i57j0l5.622j0j7&sourceid=chrome&ie=UTF-8>" %}

MVC 現在課還是很貴30小時4萬，

壓縮起來

跟不上直接抓

到時候會是一個個專案

PreMVC

WebForm 轉為

Entity Fromework 操作資料庫

VS伺服器總管可以當作簡易的SQL Server

康內訊?

### 前情提要&#xD;

有資料庫後利用 entity framework    ado.net建立模型

一個實體 屬性

![](/files/-LdDgtmABn8cZTwnQ-aO)

軟體業 架構不變但3%會快速變動才會覺得跟不上

預響應式做準備Bootstrap 鞋帶 版本很重要

版根 3.4 4.3   第一個字為版本 第二個字是修正

所以3 跟 4是不同版本且在bs裡面3與4不相容&#x20;

介面美化與響應式功能

![](/files/-LdDh-KJNPQBtampj0KV)

首頁Index 不使用了要使用index2因為套了主板Site.Master，

框架頁面概念

接下來補足新刪修

Gridview型態 bootstrap樣式

Creat 使用主板頁面的webform

```
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Create.aspx.cs" Inherits="MVC1.Create" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
</asp:Content>
```

自動鏈結主板

```
 <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
            </asp:ContentPlaceHolder>
```

### 實作create&#xD;

畫面做得再漂亮都不一定會操作 UI

只有曾經用過的經驗或是直覺UX才能告訴你怎麼做

寫回資料庫通常&#x20;

1.datasql&#x20;

2.ado.net 宣告 contion …

3.MVC方式 ( MVC書裡面有

圖片資料型態複雜 先用 try 看有沒有上傳檔案 才可以上傳

轉型態 邏輯對實體

一般來說在使用者上傳檔案後會把上傳檔案檔名處理才歸檔

圖存進伺服器 檔名存資料庫

操作entitiy fromwork&#x20;

Using MVC1.Models

DbProductEntities 類別

鑄造db物件

利用entitiy fromwork 寫回去

tProduct 資料表結構寫成類別

如此可直接指定資料進去 ( 但還是要注意轉型 要相對資料型態&#x20;

decimal 表現範圍比 int 多 比long大

上傳圖片2種方式 1.檔名放資料庫檔案放伺服器分開放 2.檔案值接進資料庫拿出來要用泛型轉回

Entity 建立資料庫物件 在把資料物件傳回model ， 在真的寫進資料庫，重新導向index2

Try 沒發生例外時會 catch 發生例外時 回傳 lblerror 錯誤訊息 ， 寫過 C#所以要編譯

#### 前端

```
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Create.aspx.cs" Inherits="MVC1.Create" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">

    <h2>產品新增</h2>
    <div class="form-horizontal">
        <hr />
        <div class="form-group">
            <label for="id" class="control-label col-md-2">編號</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtId" runat="server" class="form-control"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="name" class="control-label col-md-2">品名</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtName" runat="server" class="form-control"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="price" class="control-label col-md-2">單價</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtPrice" runat="server" class="form-control" TextMode="Number"></asp:TextBox>
            </div>
        </div>
  <div class="form-group">
            <label for="img" class="control-label col-md-2">圖</label>
            <div class="col-md-10">
                <asp:FileUpload ID="FileUpload1" runat="server" />
            </div>
        </div>

         <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <asp:Button ID="btnCreate" runat="server" Text="新增" class="btn btn-primary" OnClick="btnCreate_Click" />
                <asp:Label ID="lblError" runat="server"></asp:Label>
            </div>
        </div>
    </div>
     <div>
        <a href="Index2.aspx">返回產品列表</a>
    </div>
    </asp:Content>
```

#### 後端

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MVC1.Models;

namespace MVC1
{
    public partial class Create : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
{

        }


        //按下[儲存]按鈕
        protected void btnCreate_Click(object sender, EventArgs e)
        {
            try
            {
                string fileName = "";
                //圖片上傳儲存
                if (FileUpload1.HasFile)
                {
                    FileUpload1.SaveAs(Server.MapPath("images/" + FileUpload1.FileName));
                    fileName = FileUpload1.FileName;
                }

                //新增資料進資料庫

                dbProductEntities db = new dbProductEntities();

                tProduct product = new tProduct();
                product.fId = txtId.Text;
                product.fName = txtName.Text;
                product.fPrice = Convert.ToDecimal(txtPrice.Text);
                product.fImg = fileName;
                db.tProduct.Add(product);
                db.SaveChanges();

                Response.Redirect("Index2.aspx");

            }
            catch (Exception ex)
  {
                lblError.Text = ex.Message;
            }
        }
    }
}

```

![](/files/-LdDhBFQbytnQ4ABZIUm)

發生例外 找不到model實體

![](/files/-LdDhH2SLlPD_2Tfv54A)

把 model 開啟 右鍵 從資料庫更新模型 ( 重建

Entity fromwork 方式 model <-> db 通常就可以

老師接下來會在mvc註記因為 到時 m  v  c 是跳著做的 (有講義

### 下課後上課  實作 edit delete

新增create頁面是個空的表單去寫出來的但

編輯edit頁面必須要有原來的值才能讓人有辦法更改

所以新增頁面後將原本的頁面內容複製過來並改為編輯相關

不能編集的內容 有兩種方式 1 直接砍掉 2 readonly

```
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Edit.aspx.cs" Inherits="MVC1.Edit" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
     <h2>產品編輯</h2>
    <div class="form-horizontal">
        <hr />
        <div class="form-group">
            <label for="id" class="control-label col-md-2">編號</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtId" runat="server" class="form-control" ReadOnly="true"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="name" class="control-label col-md-2">品名</label>
            <div class="col-md-10">
 <asp:TextBox ID="txtName" runat="server" class="form-control"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="price" class="control-label col-md-2">單價</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtPrice" runat="server" class="form-control" TextMode="Number"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="img" class="control-label col-md-2">圖</label>
            <div class="col-md-10">
                <asp:FileUpload ID="FileUpload1" runat="server" />
            </div>
             <div class="col-md-10">
                 <asp:Image ID="Image1" runat="server" />
                 <asp:Label ID="lblShowImg" runat="server"></asp:Label>
            </div>
        </div>

         <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <asp:Button ID="btnSave" runat="server" Text="儲存" class="btn btn-warnning" />
              
            </div>
        </div>
    </div>
     <div>
        <a href="Index2.aspx">返回產品列表</a>
</div>

</asp:Content>

```

![](/files/-LdDhOygxGjVnMpwNXw0)

介面弄好後重點是要怎樣把資料讀過來?

必須要先給產品編號去要產品資料

回到index2將編輯扭下commandname 判斷 編輯或刪除

Commamdargument=帶值去後端

databydingas????dafqwke 資料繫結??

\<asp:LinkButton ID="lnkEdit" runat="server" CommandName="Edit" CommandArgument='<%# Eval("fId") %>'>編輯\</asp:LinkButton>

在index2新增 onrowcommand 並到後製程式碼寫邏輯，

```
<asp:GridView ID="GridView1" runat="server" CssClass="table" AutoGenerateColumns="False" GridLines="None" OnRowCommand="GridView1_RowCommand">
```

接收前面資料編號，在去弄成url轉值去edit頁面，就能讓 edit頁面知道要編輯哪一筆資料

```
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            string fId = e.CommandArgument.ToString();

            if(e.CommandName=="Edit")
            {
                Response.Redirect("Edit.aspx?fId="+ fId);
            }
        }

```

在回到 edit 後製程式碼，建立db物件，在load時就要讀產品資料出來，

所以 字串變數去取得網址 request.querystring裡面的

產品代號附加欄位aspx?後面的

```
 protected void Page_Load(object sender, EventArgs e)
        {
            //由url取得產品代號
            string fId = Request.QueryString["fId"].ToString();

```

### 透過entityfromwork不用寫sql那要怎要資料呢?&#xD;

Linq 架構寫法操作資料庫

Lambda 為 Linq的擴充寫法 類似相對 linq vs lambda = js vs jq

```
 //Lambda
            var product = db.tProduct.Where(m => m.fId == fId).FirstOrDefault();
```

新版的c#類似像js可以用以下方式

Var 資料庫.資料表.方法(參數).否則()

方法where

(參數)=(變數資料表 => 變數資料表.id == 資料表.id)&#x20;

\=>箭頭 ->指表 ©

改動了 img 變成 label ????

好像是要偷吃步不知道吃啥

現在步驟是 把model資料塞進 要顯示出來的前面的html的id的變數

Model抓出來的值餵給變數欄位

然後就能測試顯示了

![](/files/-LdDhWrVwApM5A1zJZHS)

圖片檔案如果有問題很多時候是路徑問題 結果是單引號錯

#### 前端&#xD;

```
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Edit.aspx.cs" Inherits="MVC1.Edit" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
     <h2>產品編輯</h2>
    <div class="form-horizontal">
        <hr />
        <div class="form-group">
            <label for="id" class="control-label col-md-2">編號</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtId" runat="server" class="form-control" ReadOnly="true"></asp:TextBox>
            </div>
        </div>
   <div class="form-group">
            <label for="name" class="control-label col-md-2">品名</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtName" runat="server" class="form-control"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="price" class="control-label col-md-2">單價</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtPrice" runat="server" class="form-control" TextMode="Number"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="img" class="control-label col-md-2">圖</label>
            <div class="col-md-10">
                <asp:FileUpload ID="FileUpload1" runat="server" />
            </div>
             <div class="col-md-10">
                 
                 <asp:Label ID="lblShowImg" runat="server"></asp:Label>
            </div>
        </div>

         <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <asp:Button ID="btnSave" runat="server" Text="儲存" class="btn btn-warning" />
              
            </div>
        </div>
</div>
     <div>
        <a href="Index2.aspx">返回產品列表</a>
    </div>

</asp:Content>

```

#### 後端

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//00-4-1 using MVC1.Models
using MVC1.Models;

namespace MVC1
{
    public partial class Edit : System.Web.UI.Page
    {
        //00-4-2 使用Entity建立DB物件
        dbProductEntities db = new dbProductEntities();

        protected void Page_Load(object sender, EventArgs e)
        {
            //00-4-3 讀出要修改的產品資料並放入表單欄位中

            //由url取得產品代號
            string fId = Request.QueryString["fId"].ToString();

            //Lambda
    var product = db.tProduct.Where(m => m.fId == fId).FirstOrDefault();
            txtId.Text = product.fId;
            txtName.Text = product.fName;
            txtPrice.Text = product.fPrice.ToString();
            lblShowImg.Text = "<img src='images/"+product.fImg+"' width='200' />";

        }
    }
}

```

![](/files/-LdDhgSsGtZokGeM3Sas)

題外話:

Signalr&#x20;

{% embed url="<https://www.google.com/search?ei=TD65XNv3MISVr7wPlty54A8&q=signalr&oq=sign+R&gs_l=psy-ab.1.0.0i7i10i30j0l2j0i7i30l2j0l5.14249.14249..17687...0.0..0.64.64.1......0....1..gws-wiz.IbKQKjVnrJ8>" %}

### 回到正題 ( 現在還都是 webform

#### 邏輯:&#xD;

按下儲存按鈕後要更新資料庫內容

圖片要多寫一個if判斷有沒有要更新圖，

(( 沒有要更新也要取原來的資料出來改回去

跟新增很像所以複製新增的來改

這邊省時間都沒有加一些驗證判斷實務上必須要

操作方式跟剛剛新增的方式幾乎一樣

#### 刪除邏輯:&#xD;

按鈕commamdname

傳產品代號

刪除 model裡面的 資料

在savechanges 刪除資料庫

然後更新girdview更新佔存資料庫

重新databind

實務上跳視窗確認要不要刪除

Onclientclick=return confirm(‘您確定要刪除嗎?’)

重複寫的地方值接獨立出一個不用回傳值的函數 loadData() 內聚力高偶合力低

大瑕疵

除了刪除資料庫資料外

檔案也要刪除 ( 圖片檔 )

#### 邏輯 : &#xD;

抓取檔案路徑然後根據id刪除

#### 中午下課 &#xD;

### 早上bug&#xD;

Var 那個老師選擇妥協把db往上放 我猜是新功能觸發的問題

資料無法更新 page load 要加上 !IsPostBack 不然就會post back

所以怎麼取都取到舊的值

如果上傳新的圖片檔案刪除要把既有的圖片檔案刪除

資料刪除可以刪掉但是 onrowdeleting 會觸發的函數

忽略了 commandname = delete 一定會觸發上述

方式為 刪掉 onrowdeleting 改掉 commandname = killme

因為之前 edit是在別頁觸發的好像就沒這個問題&#x20;

![](/files/-Ld3EPw0mhwXLyW4_bSa)

前端 edit   ( delete 也在 edit內

```
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="Edit.aspx.cs" Inherits="MVC1.Edit" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
     <h2>產品編輯</h2>
    <div class="form-horizontal">
        <hr />
        <div class="form-group">
            <label for="id" class="control-label col-md-2">編號</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtId" runat="server" class="form-control" ReadOnly="true"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="name" class="control-label col-md-2">品名</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtName" runat="server" class="form-control"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="price" class="control-label col-md-2">單價</label>
            <div class="col-md-10">
                <asp:TextBox ID="txtPrice" runat="server" class="form-control" TextMode="Number"></asp:TextBox>
            </div>
        </div>

        <div class="form-group">
            <label for="img" class="control-label col-md-2">圖</label>
            <div class="col-md-10">
                <asp:FileUpload ID="FileUpload1" runat="server" />
            </div>
div class="col-md-10">
                 
                 <asp:Label ID="lblShowImg" runat="server"></asp:Label>
            </div>
        </div>

         <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <asp:Button ID="btnSave" runat="server" Text="儲存" class="btn btn-warning" OnClick="btnSave_Click" />
              
            </div>
        </div>
    </div>
     <div>
        <a href="Index2.aspx">返回產品列表</a>
    </div>

</asp:Content>

```

#### 後端 edit

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
//00-4-1 using MVC1.Models
using MVC1.Models;

namespace MVC1
{
    public partial class Edit : System.Web.UI.Page
{
        //00-4-2 使用Entity建立DB物件
        dbProductEntities db = new dbProductEntities();

        protected void Page_Load(object sender, EventArgs e)
        {
            //00-4-3 讀出要修改的產品資料並放入表單欄位中
            if (!IsPostBack)
            {
                //由url取得產品代號
                string fId = Request.QueryString["fId"].ToString();

                //Lambda
                var product = db.tProduct.Where(m => m.fId == fId).FirstOrDefault();
                txtId.Text = product.fId;
                txtName.Text = product.fName;
                txtPrice.Text = product.fPrice.ToString();
                lblShowImg.Text = "<img src='images/" + product.fImg + "' width='200' />";
            }
        }

        //按 [儲存] 鈕時執行
        protected void btnSave_Click(object sender, EventArgs e)
        {

            //dbProductEntities db = new dbProductEntities();
            string fileName, fId;
            fId = txtId.Text;
            var product = db.tProduct.Where(m => m.fId == fId).FirstOrDefault();
            fileName = product.fImg;

            //圖片上傳儲存
            if (FileUpload1.HasFile)
            {
                FileUpload1.SaveAs(Server.MapPath("images/" + FileUpload1.FileName));
                fileName = FileUpload1.FileName;
            }

            //00-3-4 使用Entity Framework新增資料
            product.fName = txtName.Text;
            product.fPrice = Convert.ToDecimal(txtPrice.Text);
            product.fImg = fileName;//如果使用者沒上傳就用原來的檔名
            db.SaveChanges();//回寫結果

            Response.Redirect("Index2.aspx");



        }
    }
}

```

###

###

###

###

### 老師版本的有把程式碼步驟放上去 index2.aspx.cs

//00-1 利用Entity Framework建立Model(DB First)&#x20;

//00-1-1 建立dbProduct.mdb資料庫Model&#x20;

// 在Models上按右鍵,選擇加入,新增項目,資料,ADO.NET實體資料模型,名稱輸入"ProductModel",按新增&#x20;

// 來自資料庫的EF Designer&#x20;

// 連接dbProduct.mdf資料庫,連線名稱不修改,按下一步按鈕&#x20;

// 選擇Entity Framework 6.x, 按下一步按鈕&#x20;

// 資料表勾選"tProuct", 按完成鈕&#x20;

// 若跳出詢問方法按確定鈕&#x20;

//00-1-2 在專案上按右鍵,建置

//00-2 撰寫Index2.aspx的後置程式碼&#x20;

//00-2-1 using MVC1.Models&#x20;

//00-2-2 使用Entity建立DB物件&#x20;

//00-2-3 將讀出的資料餵給GridView&#x20;

//00-2-4 撰寫GridView裡的按鈕被按下時所要做的事

//00-3 撰寫Create.aspx的後置程式碼&#x20;

//00-3-1 using MVC1.Models&#x20;

//00-3-2 撰寫"儲存"鈕被按下時要做的事

//00-3-3 使用Entity建立DB物件&#x20;

//00-3-4 使用Entity Framework新增資料

//00-4 撰寫Edit.aspx的後置程式碼&#x20;

//00-4-1 using MVC1.Models&#x20;

//00-4-2 使用Entity建立DB物件&#x20;

//00-4-3 讀出要修改的產品資料並放入表單欄位中&#x20;

//00-4-4 撰寫"儲存"鈕被按下時要做的事&#x20;

//00-4-5 使用Entity Framework更新資料

#### 下午&#x20;

## 第五次專題報告 – ERD所衍生的資料庫與關聯圖

![](/files/-Ld3EtTbI9zYijEo8nHP)

### 第一組&#xD;

已經時做資料庫與資料上傳頁面串接

更改了一些上次覺得有問題的ermodel內容

### 第四組&#xD;

Remodel 增加留言板 然後 檢舉修改 讚的部分修改

老師說明

問題很難問?

工科論文 因為做出來了怎問?

管理面很好問

你們有沒有考慮到什麼?

Member 為何用 email當作主key&#x20;

可是erd是錯的

Pwd長度 varchar 4000 雜湊

雜湊完不知道本來密碼那怎辦

直接給新的密碼

### 第五組&#xD;

log 修改紀錄也要存表

違規分為三種

用使用者 ( 包含管理者 商城與寄信 違規與修改紀錄log&#x20;

個人會員信息

分為四個關聯  共通資料庫

很多連遊玩實際記錄也會記錄下來

![](/files/-LdDhr74ykswI-YWFyjb)

![](/files/-LdDhw37oo0ncsc_gz_R)

![](/files/-LdDi-yzlURn6z6zs92k)

以下組別因為大雷雨所以 …&#x20;( 雷聲大雨點小所以就不深入記錄了

### 題外話 經濟

本益比 越小越好 &#x20;

本夢比

Dos 時帶 很多遊戲都是 大宇做的

{% embed url="<https://oldgame01.com/OI80>" %}

台灣的盤都是外資盤操盤寡ˇ

佔獨占性競爭等等&#x20;

看來要去看經濟學

市場機制 颱風沒來菜還是很貴 中華電信 寡占市場 不賺錢打趴對手 價格歌喉戰

個體撿到便宜 但總體經濟降低 市場不活絡 消費者剩餘 市場GG

拿不出綜效 只會持續一年&#x20;

EX劉兆玄 企業主都知道但有利益都不講

![](/files/-LdDi5bNVfsWc_oVGL5P)

![](/files/-LdDiANExFHo42bV-s1I)

![](/files/-LdDiF8ywOHYJonn3bnh)
