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; }
}
}
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空白处点击右键—,在Db.cs中写操作数据库代码。

9、调用
private void Add()
{
using (var db = Db.Open())
{
Student c = new Student();
c.Code = "";
c.Name = "一班";
db.Students.InsertOnSubmit(c);
db.SubmitChanges();
}
}
EF中多表公共字段,以及设置EntityBase使所有实体类继承自定义类的更多相关文章
- 在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?
在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VA ...
- 使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)
1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip ...
- Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射?
NET[C#]Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射? 问题描述 比如有如下的数据表结构:Person: person_id int first_name va ...
- Java对比两个数据库中的表和字段,写个冷门的东西
Java对比两个数据库中的表和字段,写个冷门的东西 转载的 来源网络 目前所在的项目组距离下个版本上线已经很近了,就面临了一个问题:开发人员在开发库上根据需要增加数据表.数据字段.或者变更了字段类型或 ...
- 查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数
查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06| 分类: SQL SERVER|举报|字号 订阅 ( ...
- JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- WordPress数据库中的表、字段、类型及说明
wp_categories: 用于保存分类相关信息的表.包括了5个字段,分别是: cat_ID – 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment. c ...
- MySql中数据表增加字段很慢怎么办
正确的做法是这样,对于数据量很大的表,需要添加所有或者修改字段的做法是如下: 1.先创建一张一样的表 create table new_tb like tb_old; 2.修改创建表的字段 alter ...
- 获取SQL Server数据库中的表和字段描述
获取所有dbo表的扩展属性: SELECT * FROM fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', default, NULL, ...
随机推荐
- python 如何放心干净的卸载模块
windows系统: C:\selenium-2.43.0>python setup.py install --record ./record.txt C:\selenium-2.43.0> ...
- jquery ajax事件执行顺序
jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...
- floyed算法的一些感想
for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) if(f[i][k]+f[k][j]<f[i ...
- POJ1751 Highways(Prim)
Highways Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13182 Accepted: 3814 Speci ...
- 【Android】自定义View
内置组件经常不满足我们的需求,那么就要自己来重写了,一般需要实现以下几个父类方法: 1.onMeasure 决定内部View的宽和高,以及自身的宽和高 2.onLayout 决定子View的放置位置 ...
- [BZOJ 2006] 超级钢琴
Link: https://www.lydsy.com/JudgeOnline/problem.php?id=2006 Algorithm: 对于此类区间最值类问题,我们可以通过控制一端不变来寻找当前 ...
- POJ 2082 Terrible Sets(单调栈)
[题目链接] http://poj.org/problem?id=2082 [题目大意] 给出一些长方形下段对其后横向排列得到的图形,现在给你他们的高度, 求里面包含的最大长方形的面积 [题解] 我们 ...
- 【贪心】【线性基】bzoj2844 albus就是要第一个出场
引用题解:http://blog.csdn.net/PoPoQQQ/article/details/39829237 注意评论区. #include<cstdio> using names ...
- React Native之iOS App打包
iOS打包步骤(一.二.三可不按照顺序) 步骤一: 选择iOS Device(以下两者选其中一个即可) 选择 Generic iOS Device (个人建议使用这个) 选择Generic iOS D ...
- Orcale自增/Hibernate 配置
-- 自增 create sequence SEQ_T_APP_USER start with 1 increment by 1; -- 触发器 create trigger DECTUSER_T_ ...