OpenAccess快速入門09

  • 1219
  • 0
  • 2013-10-13

OpenAccess快速入門09

DotBlogs Tags: , , , , ,

OpenAccess 快速入門將協助我們熟悉 OpenAccess,第九篇將承續前一篇文章,說明如何建立關聯物件並寫入資料庫。

----------

前一篇我們很簡單就可以建立一個 Employee 物件,並寫入資料庫,並且說明了 Oracle 透過 Trigger 做自動增號,然後新增完會把自動增號的值回押到新增的 Employee 物件 EmployeeId 屬性中。這篇,我們進一步做關聯式新增,將以產品(Products)和類別(Categories)為例。

以下我們的範例,是在新增一筆產品資料時,一併建立一筆新的類別資料。首先,我們在 Model 專案中,上一篇新增的 CreateEntities 類別增加 CreateProductAndCategory 函式:


Public Function CreateProductAndCategory() As Products
    Dim category As New Categories()
    With category
        .CATEGORYNAME = "進擊類"
        .DESCRIPTION = "傳說中的人類剋星"
    End With
    Dim product As New Products()
    With product
        .PRODUCTNAME = "一般種巨人"
        .Categories = category
        .DISCONTINUED = 0
        .VOA_CLASS = "123456789"
    End With
    cxt.Add(product)
    cxt.SaveChanges()
    Return product
End Function

上面程式碼,我們分別建立 Categories 和 Products 兩個物件實體(product, category),並設定相關屬性值,然後最重要的是透過導覽屬性,設定所屬類別:


product.Categories = category

上述程式,可以將 Categories 物件和 Products 物件建立起關聯,最後我們在物件容器中加入 product,並執行 SaveChanges() 函式,此函式會在新增 product 時,發現 product.Categories 屬性中所指認的 category 是新建立的物件,轉而先將 category 寫入資料表,再寫入 product。

請注意,我們沒有設定 Product.CategoriesId 喔,因為此產品所屬的類別在資料庫中並不存在,所以當然無法設定,但是我們期待此屬性會如同 ProductId 屬性一樣,在 SaveChanges() 後,自動回填。

為了驗證 SaveChanges() 會先新增 category,並回填 CategoriesId,然後才會寫入 product 的資料,所以我們刻意把 Products.CategoriesId 改成必填(原本給大家的 Script 中,此欄位是允許 Null):

142430

為了快速驗證程式碼是否正確,我們撰寫一個測試,目的是驗證此函式不會出現 Exception,而且會自動回填新增的 ProductId 和 CategoriesId:


<TestMethod()> _
Public Sub CreateProductAndCategoryTest()
    Dim target As CreateEntities = New CreateEntities()
    Dim actual As Products = target.CreateProductAndCategory()
    Assert.IsNotNull(actual)
    Assert.IsNotNull(actual.PRODUCTID)
    Assert.IsNotNull(actual.CATEGORYID)
    Assert.IsNotNull(actual.Categories)
End Sub

測試通過後,我們回到頁面上,建立一個 CreateNewProductAndCatagory.aspx 頁面,把新增完的結果顯示出來:

CreateNewProductAndCatagory.aspx


<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="CreateNewProductAndCategory.aspx.vb" Inherits="OpenAccessWebApp01.CreateNewProductAndCategory" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="btnCreateProduct" runat="server" Text="建立新產品包含新類別" />
            <hr />
            <p>產品編號:<asp:Label ID="lblProductId" runat="server" Text=""></asp:Label></p>
            <p>產品名稱:<asp:Label ID="lblProductName" runat="server" Text=""></asp:Label></p>
            <p>所屬類別編號:<asp:Label ID="lblCategoryId" runat="server" Text=""></asp:Label></p>
            <p>所屬類別名稱:<asp:Label ID="lblCategoryName" runat="server" Text=""></asp:Label></p>
        </div>
    </form>
</body>
</html>

CreateNewProductAndCatagory.aspx.vb


Imports OpenAccessWebApp01Model

Public Class CreateNewProductAndCategory
    Inherits System.Web.UI.Page

    Private Sub btnCreateProduct_Click(sender As Object, e As EventArgs) Handles btnCreateProduct.Click
        Dim bo As New CreateEntities()
        Dim product = bo.CreateProductAndCategory()
        lblProductId.Text = product.PRODUCTID
        lblProductName.Text = product.PRODUCTNAME
        lblCategoryId.Text = product.CATEGORYID
        lblCategoryName.Text = product.Categories.CATEGORYNAME
    End Sub
End Class

132037

--------
沒什麼特別的~
不過是一些筆記而已