Entity Framework 4增加了一個新功能--Pluralization,在Entity Data Model Wizard中能偵測資料表名稱的單複數性質,以便在產生EF類別時貫徹"EntityObject名稱用單數,ObjectSet<EntityObject>名稱用複數"的原則。也說是說,如果資料庫有個資料表名稱是User,則個體類別名稱會是User,集合類別是Users;但如果資料表名稱本身已經是複數,例如: Fishes,一樣會個體類別名稱會用單數Fish,集合類別名稱用複數Fishes。

用實例來示範: 資料庫中有三個資料表要轉成EF類別,分別是Fishes、Products、Story,兩個複數、一個單數,而且故意挑 加es、加s、y改ies 三種單複數變化,考驗EF4的能耐。

轉換結果顯示,這點考驗對喝洋墨水長大的EF4只是一塊蛋糕,三個Table的對應類別被正確地解析成Fish/Fishes、Story/Stories、Product/Produts,不管Table名稱是單數或複數,在宣告類別時一律EntityObject名稱取單數、ObjectSet<EntityObject>集合名稱取複數。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using LabModel;
 
public class Class1
{
    public Class1()
    {
        using (var ctx = new LabModel.LabEntities())
        {
            //EntityObject的名稱是Fish
            var fish = new Fish();
            //ObjectSet<Fish>的名稱是Fishes
            var fishes = ctx.Fishes;
 
            //EntityObject的名稱是Story
            var story = new Story();
            //ObjectSet<Story>的名稱是Stories
            var stories = ctx.Stories;
 
            //EntityObject的名稱是Product
            var product = new Product();
            //ObjectSet<Product>的名稱是Products
            var products = ctx.Products;
        }
    }
}

由於英文名詞的單複數轉換有一些特殊規則,th/sh結尾要加es、y結尾要改ies... 等等。EF4新增了一個PluralizationService類別專門處理,甚至可針對不同語系提供各種語言的單複數規則。只是開發程式時,類別名稱多半還是以英文為主,EntityObject叫"使用者"、"主機",集合名稱叫"使用者們"、"主機群"? 感覺怪怪的。

以下是個有趣的測試網頁,輸入英文名詞後呼叫PluralizationService找出單數及複數形式的名稱。

<%@ Page Language="C#" %>
<%@ Import Namespace = "System.Data.Entity.Design.PluralizationServices" %>
<%@ Import Namespace = "System.Globalization" %>
 
<!DOCTYPE html>
 
<script runat="server">
    protected void btnConv_Click(object sender, EventArgs e)
    {
        var ps = PluralizationService.CreateService(
                    CultureInfo.GetCultureInfo("en-us"));
        string name = txtName.Text;
        lblResult.Text = 
            string.Format("單數 = {0}  /  複數 = {1}",
                ps.IsSingular(name) ? name : ps.Singularize(name),
                ps.IsPlural(name) ? name : ps.Pluralize(name)
            );
    }
</script>
 
<html>
<head runat="server">
    <title>EF4 Pluralization Test</title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
    <asp:Button ID="btnConv" runat="server" Text="轉換" onclick="btnConv_Click" />
    <br />
    <asp:Label ID="lblResult" runat="server"></asp:Label>
    </form>
</body>
</html>

PluralizationService並非內建整套牛津字典收藏整套英文單複數字彙,而是透過一些規則依英文字尾決定單複數如何變形,再加入一些特例。所以就算輸入一些稀奇古怪不存在的英文字,它也能依一般常規轉換出符合習慣的用字,應用在程式開發上已十分足夠。


Comments

# by KKBruce

PluralizationService找出單數及複數形式的名稱,原來還可以這樣玩!

Post a comment


55 + 7 =