Entity Framework 4的單複數自動識別功能
2 |
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找出單數及複數形式的名稱,原來還可以這樣玩!
# by Rita
She is a housewife.