EF4 原生不支援 CLR Enum 直接映射資料庫整數欄位。利用 Complex Type (復雜類型) 包裝 Enum,配合隱式轉換運算子,實現「代碼用 Enum、資料庫存 int」的無縫體驗。需使用 POCO 實體,不可用設計器自動生成類別。
CREATE TABLE Account (
ID uniqueidentifier PRIMARY KEY DEFAULT NEWSEQUENTIALID(),
UserName nvarchar(20) NOT NULL,
Password varchar(40) NOT NULL,
Email nvarchar(100) NOT NULL,
Role int NOT NULL -- 對應 Enum
);
INSERT INTO Account (UserName, Password, Email, Role) VALUES
('Test1','Test1','test1',1),
('Test2','Test2','test2',1),
('Test3','Test3','test3',2);
// 業務枚舉
public enum AccountRoleEnum { Admin = 1, User = 2 }
// Complex Type 包裝器:負責 Enum ↔ int 雙向轉換
public partial class RoleWrapper
{
private AccountRoleEnum _role;
// EF 映射用:資料庫 int 欄位
public int Value
{
get => (int)_role;
set => _role = (AccountRoleEnum)value;
}
// 代碼用:強類型 Enum
public AccountRoleEnum EnumValue
{
get => _role;
set => _role = value;
}
// 隱式轉換:Enum → Wrapper
public static implicit operator RoleWrapper(AccountRoleEnum role)
=> new RoleWrapper { EnumValue = role };
// 隱式轉換:Wrapper → Enum
public static implicit operator AccountRoleEnum(RoleWrapper wrapper)
=> wrapper?.EnumValue ?? AccountRoleEnum.User;
}
public class Account
{
public Guid ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public RoleWrapper Role { get; set; } // 映射 Complex Type
}
public class EntitiesContext : ObjectContext
{
public EntitiesContext() : base("name=Entities", "Entities")
{
_accounts = CreateObjectSet();
}
public ObjectSet Accounts => _accounts;
private ObjectSet _accounts;
}
// 記憶體比較:直接用 Enum
var admin = ctx.Accounts.FirstOrDefault(a => a.Role == AccountRoleEnum.Admin);
// LINQ to Entities 查詢:必須用 Value (int) 轉 SQL
var admins = ctx.Accounts.Where(a => a.Role.Value == (int)AccountRoleEnum.Admin).ToList();
// 新增/修改:直接賦值 Enum,隱式轉換自動處理
var newAcc = new Account {
ID = Guid.NewGuid(),
UserName = "Test4",
Role = AccountRoleEnum.User // 隱式轉換為 RoleWrapper
};
ctx.AddObject("Accounts", newAcc);
ctx.SaveChanges();
.Value == (int)EnumRoleWrapper Complex TypeHasConversion() 原生支援 Enum,此模式適用於 EF4 維護專案