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
  • 相关阅读:
    guzzle下载图片(laravel+vue)
    leetcode——131.分割回文串
    leetcode——139.单词拆分
    leetcode——115.不同的子序列
    leetcode——72.编辑距离
    leetcode——87.扰乱字符串
    leetcode——123. 买卖股票的最佳时机 III
    leetcode——132. 分割回文串 II
    leetcode——124. 二叉树中的最大路径和
    leetcode——51.N皇后
  • 原文地址:https://www.cnblogs.com/xiaochun126/p/4819747.html
Copyright © 2011-2022 走看看