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 = "001";
                c.Name = "一班";
                db.Students.InsertOnSubmit(c);
                db.SubmitChanges();
            }
        }

时间: 2024-10-21 00:24:01

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

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

在高并发.高负载的情况下,如何给表添加字段并设置DEFAULT值? 在Oracle 12c之前,当Oracle表数据量上亿时,对表执行“ALTER TABLE XXX ADD COLUMN_XX VARCHAR2(2) DEFAULT 'XXX';”操作时,效率及安全性是必须要考虑的因素.若直接执行,则会在该过程中给表加上6级表锁,也就是连查询都需要等待,这在生产库上是相当危险的操作.因为Oracle在执行上述操作过程中,不仅要更新数据字典,还会刷新全部的记录,并且会使得Undo表空间暴涨,所以

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

1,根据数据库类型拼接不同URL /** * 根据类型不同拼接连接的URL * @param dbType 1:mysql.2:oracle.3:sql server.4:gp * @param ip * @param port * @param databaseName * @return*/ public static String getTestDbUrl(int dbType, String ip, String port, String databaseName){ String ur

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

Java对比两个数据库中的表和字段,写个冷门的东西 转载的 来源网络 目前所在的项目组距离下个版本上线已经很近了,就面临了一个问题:开发人员在开发库上根据需要增加数据表.数据字段.或者变更了字段类型或者字段长度等等. 由于时间比较紧迫,导致在开发过程中不可能一一把DDL数据库脚本记录下来,在比较大的项目中,比如我所在项目开发的系统大概包含了800张左右的表,字段上10000个的情况下,人工处理明显不可行,所以我们就得通过程序来判断比对,哪些是我们需要新增加的表,哪些是我们需要新增加的字段,哪些是

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

查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06|  分类: SQL SERVER|举报|字号 订阅 (1)查询SQLServer2005中某个数据库中的表结构 SELECT TOP 100 PERCENT --a.id,CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名,CASE WHEN a.colorder = 1 THEN isnull(f.v

二、修改表、字段属性设置、索引设置、约束设置

 字段属性设置 not null 不为空 auto_increment 设定int类型字段的值可以"自增长",即其值无需"写入",而会自动获得并增加 注:此属性必须随同 primary key  或 unique key 一起使用. [primary] key: 设定为主键.是唯一键"加强":也不能重复并且不能使用null,并且可以作为确定任意一行数据的"关键值" unique  [key] : 设定为唯一键:表示该字段的

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

wp_categories: 用于保存分类相关信息的表.包括了5个字段,分别是: cat_ID – 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment. cat_name – 某个分类的名称,为一个varchar(55)值. category_nicename – 指定给分类的一个便于记住的名字,也就是所谓的slug,这是一个varchar(200)值. category_description – 某个分类的详细说明,longtext型值. cate

Mysql数据库中 User表权限字段说明全介绍

一:mysql权限表user字段详解: Select_priv.确定用户是否可以通过SELECT命令选择数据. Insert_priv.确定用户是否可以通过INSERT命令插入数据. Update_priv.确定用户是否可以通过UPDATE命令修改现有数据. Delete_priv.确定用户是否可以通过DELETE命令删除现有数据. Create_priv.确定用户是否可以创建新的数据库和表. Drop_priv.确定用户是否可以删除现有数据库和表. Reload_priv.确定用户是否可以执行

EF中連表查詢的應用方式

1.首先我們想讓列表頁顯示兩個表的共同數據 這裡有兩張表 public class mytype    {        public int mytypeID { get; set; }        public string mytypeName { get; set; }    } public class Author    {        public int AuthorID { get; set; }        public string AuthorName { get;

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

获取所有dbo表的扩展属性: SELECT * FROM fn_listextendedproperty (NULL, 'schema', 'dbo', 'table', default, NULL, NULL) 大概的结果: objtype objname name value TABLE 表名 扩展属性名 值 获取表的扩展属性: select * from ::fn_listextendedproperty (null,'user','dbo','table','表名','column',n