EF中多表公共字段,以及设置EntityBase使所有实体类继承自定义类

使用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; }
    }
}
View Code

4、 Student类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication1.Data
{
    public partial class Student:IAudited
    {
       
    }
}
View Code

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() { }
    }
}
View Code

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();
            }
        }
View Code
原文地址:https://www.cnblogs.com/xiaochun126/p/4819747.html