使用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(); } }