使用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使所有实体类继承自定义类的更多相关文章

  1. 在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?

    在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VA ...

  2. 使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)

    1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip ...

  3. Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射?

    NET[C#]Dapper中数据表的字段(列)与实体属性不一致时,如何手动配置它们之间的映射? 问题描述 比如有如下的数据表结构:Person: person_id int first_name va ...

  4. Java对比两个数据库中的表和字段,写个冷门的东西

    Java对比两个数据库中的表和字段,写个冷门的东西 转载的 来源网络 目前所在的项目组距离下个版本上线已经很近了,就面临了一个问题:开发人员在开发库上根据需要增加数据表.数据字段.或者变更了字段类型或 ...

  5. 查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数

    查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06|  分类: SQL SERVER|举报|字号 订阅     ( ...

  6. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  7. WordPress数据库中的表、字段、类型及说明

    wp_categories: 用于保存分类相关信息的表.包括了5个字段,分别是: cat_ID – 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment. c ...

  8. MySql中数据表增加字段很慢怎么办

    正确的做法是这样,对于数据量很大的表,需要添加所有或者修改字段的做法是如下: 1.先创建一张一样的表 create table new_tb like tb_old; 2.修改创建表的字段 alter ...

  9. 获取SQL Server数据库中的表和字段描述

    获取所有dbo表的扩展属性: SELECT * FROM fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', default, NULL, ...

随机推荐

  1. codeforces-455A

    题目连接:http://codeforces.com/contest/455/problem/A A. Boredom time limit per test 1 second memory limi ...

  2. codeforces Round #440 C Maximum splitting【数学/素数与合数/思维/贪心】

    C. Maximum splitting time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. 大数据技术之_16_Scala学习_07_数据结构(上)-集合

    第十章 数据结构(上)-集合10.1 数据结构特点10.1.1 Scala 集合基本介绍10.1.2 可变集合和不可变集合举例10.2 Scala 不可变集合继承层次一览图10.2.1 图10.2.2 ...

  4. 学习LSM(Linux security module)之三:Apparmor的前世今生和基本使用

    感冒了,感觉一脑子浆糊,真是蛋疼. 先粗略讲一些前置知识. 一:MAC和DAC DAC(Discretionary Access Control),自主访问控制,是最常用的一类访问控制机制,意思为主体 ...

  5. 5、Django实战第5天:首页和登录页面的配置

    从这天开始我们需要用到前端源码,需要的朋友可以进行小额打赏(15元),打赏二维码在博客的右侧,打赏后可以凭截图联系463951510@qq.com,博主收到邮件后会立即回复发送所有源码素材,实战过程中 ...

  6. 转 IntelliJ IDEA 快捷键

    https://www.cnblogs.com/clwydjgs/p/9390488.html 一.视图查看 Ctrl+F12 查看file,method结构图.类继承机构图 (不知道方法结构,Ctr ...

  7. java中Frame Jpanel等中间显示

    几种是窗口中间显示的方法: 1.Frame int windowWidth = frame.getWidth(); //获得窗口宽 int windowHeight = frame.getHeight ...

  8. [美团 CodeM 初赛 Round A]最长树链

    题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...

  9. 1.3(Mybatis学习笔记)动态SQL

    一.<if> 使用<if>可以根据具体情况来拼接SQL语句,使其更加灵活更加适应我们的需求. <if>的标签体中是需要拼接的语句,满足条件才会将其进行拼接. < ...

  10. TabHost

    (一) 知识点:id使用系统自带 1.效果图: 2.布局 activity_main.xml <?xml version="1.0" encoding="utf-8 ...