使用EF框架訪問數據庫時,如果某些表具有公共字段,例如在審核流程中,對於各類申請單資料的創建人、創建時間、修改人、修改時間,這些可能多表都需要的字段,如果在每個實體中進行賦值操作顯然是類似和重復的,下面是一個統一在數據提交時進行賦值的例子(經簡化,如果只是為記錄時間並不用這么做),記錄如下:
1、 創建一個公用接口IAudited,包含公用字段,申請單實體類繼承這個接口。
2、 定義一個抽象類DbEntity(用dbml文件的EntityBase屬性,使數據庫實體類都繼承自此類),定義OnSaving,檢查可以轉轉化為IAudited的實體,統一賦值公共字段。
3、 Db訪問數據庫類,提交數據前將數據轉會為DbEntity,並調用OnSaving使公共字段數據賦值后后再存入數據庫。
具體代碼以一個MVC3項目為例:
1、 新建一個MVC3項目,目錄結構如下:
2、 添加Db.dbml,選擇菜單View-Server Explorer,添加數據庫連接,選擇數據庫中的表拖放到打開的Db.dbml
3、 IAudited類

using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcApplication1.Data { public interface IAudited { DateTime CreateOn { get; set; } DateTime LastUpdateOn { get; set; } } }
4、 Student類

using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcApplication1.Data { public partial class Student:IAudited { } }
5、 DbEntity類

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Linq; namespace MvcApplication1.Data { public abstract class DbEntity { public virtual void OnSaving(ChangeAction changeAction) { var auditEntity = this as IAudited; if (auditEntity != null) { if ((changeAction == ChangeAction.Update) || (changeAction == ChangeAction.Insert)) { auditEntity.LastUpdateOn = DateTime.Now; if (changeAction == ChangeAction.Insert) { auditEntity.CreateOn = auditEntity.LastUpdateOn; } } } } public virtual void OnSaved() { } } }
6、 設置使數據庫實體類全部繼承DbEntity,先關閉Db.dbml(切記必須關閉),選擇Db.Dbml文件 右鍵--打開為--選擇XML格式—OK
在第一行添加EntityBase="DbEntity"
這時打開Db.designer.cs,可以看到所有的實體類都繼承了DbEntity
8、打開Db.dbml在空白處點擊右鍵,選擇屬性,修改Name為Db,再在打開的Db.dbml空白處點擊右鍵—View Code,在Db.cs中寫操作數據庫代碼。
9、調用

private void Add() { using (var db = Db.Open()) { Student c = new Student(); c.Code = "001"; c.Name = "一班"; db.Students.InsertOnSubmit(c); db.SubmitChanges(); } }