zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【计蒜客】贝壳找房户外拓展(中等)扫描线+线段树
    【CodeForces】925 C.Big Secret 异或
    【LibreOJ】#6392. 「THUPC2018」密码学第三次小作业 / Rsa 扩展欧几里得算法
    【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
    【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树
    【BZOJ】2111: [ZJOI2010]Perm 排列计数 计数DP+排列组合+lucas
    【计蒜客】百度科学家(困难)
    【BZOJ】2115: [Wc2011] Xor
    【GDOI2018】所有题目和解题报告
    【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序
  • 原文地址:https://www.cnblogs.com/xiaochun126/p/4819747.html
Copyright © 2011-2022 走看看