使用 Entity Framework 來存取資料實在是很方便,但如果要用 enum 時就不能 work 了。
Entity Framework 5.0 支援 Enum
在尚未上市的 VS11 中,就直接支援了 enum。當然需要用 NuGet 安裝 Entity Framework

public class AuditLog
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public string Account { get; set; }
[Column("AuditTime")]
public DateTime Date { get; set; }
[MaxLength(10)]
public string GroupName { get; set; }
public int FunctionId { get; set; }
public AuditStatus Status { get; set; }
public override string ToString()
{
return string.Format("Id={0}, Account={1}, Date={2}, GroupName={3}, FunctionId={4}, Status={5}", Id, Account, Date, GroupName, FunctionId, Status);
}
}
public class BasicContext : System.Data.Entity.DbContext
{
public BasicContext(string dbName)
: base(dbName)
{ }
public DbSet<AuditLog> AuditLogs { get; set; }
}
public enum AuditStatus
{
Success,
Fail
}
呼叫的方式也非常簡單,就與一般 c# 沒差。
static void Main(string[] args)
{
Database.SetInitializer<BasicContext>(new DropCreateDatabaseIfModelChanges<BasicContext>());
using (var context = new BasicContext("DbName"))
{
bool isCreated = context.Database.CreateIfNotExists();
Console.WriteLine(isCreated);
var audit = new AuditLog() { Account = "E", Date = DateTime.Now, FunctionId = 1, Status = AuditStatus.Fail };
context.AuditLogs.Add(audit);
context.SaveChanges();
var q = from i in context.AuditLogs
select i;
foreach (var auditLog2 in q)
Console.WriteLine(auditLog2);
}
}
產生得資料庫如下圖

Entity Framework 4.3.1 的方式
相同的程式,在 4.3.1 版以前是沒有作用的。 Entity Framework 對不支援的欄位,就視而不見,因此相同的程式,在資料庫中就是看不到 Status 的欄位。
有沒有什麼變通方法嗎?有! 只需要改一下屬性存取方式即可。程式如下
public int StatusValue { get; set; }
public AuditStatus Status
{
get { return (AuditStatus)StatusValue; }
set { StatusValue = (int) value; }
}
程式寫作時,是透過 Status 來存取,但 Entity Framework 看不懂 AuditStatus 欄位,因此就不理 Status 欄位了。取而代之,是產生 StatusValue 欄位
結果如下

如果想要產生 Status 欄位呢?再變通一下
[Column("Status")]
public int StatusValue { get; set; }
[NotMapped]
public AuditStatus Status
{
get { return (AuditStatus)StatusValue; }
set { StatusValue = (int) value; }
}
上述的屬性(Attribute) 告訴 entity framework,Status 這個 enum Property 不必理會。而 StatusValue 這個 int Property 要對應到資料表的 Status 欄位。