使用SaveChanging事件

来源:互联网 发布:java web sqlserver 编辑:程序博客网 时间:2024/05/18 14:28

1、使用ADO.Net Entity Data Model 和Linq to Sql 建立数据访问层,SqlBtmsModel 为 生成的ObjectContext 实现类或者DataContext 的实现类

2、编写代码 实现 ObjectContext 或者 DataContext 的 分部定义

partial class SqlBtmsModel
    {

        public static Action<SqlBtmsModel> RecordHandel;
        private bool logFlag = true;
        public SqlBtmsModel(bool logFlag) :
            base("name=SqlBtmsModel", "SqlBtmsModel")
        {
            this.logFlag = logFlag;
            OnContextCreated();
        }

        partial void OnContextCreated()
        {
            if (logFlag)
                this.SavingChanges += new EventHandler(Context_SavingChanges);
        }

        private void Context_SavingChanges(object sender, EventArgs e)
        {
            SqlBtmsModel context = sender as SqlBtmsModel;
            RecordHandel(context);
        }
    }

3、定义日志类

public class SqlLogManager
    {

 public static void SaveToDB(SqlBtmsModel context)
        {
            foreach (ObjectStateEntry entry in
                context.ObjectStateManager.GetObjectStateEntries(
                EntityState.Added | EntityState.Modified | EntityState.Deleted))
            {
                string currentValues = "", originalValues = "";
                switch (entry.State)
                {

                    case EntityState.Added:
                        currentValues = "";
                        foreach (string item in entry.GetModifiedProperties())
                        {
                            currentValues += " |" + item + ":" + entry.CurrentValues[item];
                        }

                        Save(context, EntityState.Added, entry.EntitySet.Name, null, currentValues);
                        break;
                    case EntityState.Modified:
                        currentValues = ""; originalValues = "";
                        foreach (string item in entry.GetModifiedProperties())
                        {
                            originalValues += " |" + item + ":" + entry.OriginalValues[item];
                            currentValues += " |" + item + ":" + entry.CurrentValues[item];
                        }
                        Save(context, EntityState.Modified, entry.EntitySet.Name, originalValues, currentValues);
                        break;
                    case EntityState.Deleted:
                        originalValues = "";
                        foreach (string item in entry.GetModifiedProperties())
                        {
                            originalValues += " |" + item + ":" + entry.OriginalValues[item];
                        }

                        Save(context, EntityState.Deleted, entry.EntitySet.Name, originalValues, null);
                        break;
                }

            }
        }
        private static void Save(SqlBtmsModel context, EntityState operationType, string entitySetName, string originalValues, string currentValues)
        {
            SqlBtmsModel logContext = new SqlBtmsModel(false);
            OperationRecords record = new OperationRecords();
            UserInfo userInfo = UserInfo.GetUserInfo();
            record.SeqNo = Guid.NewGuid();
            record.OperateDate = DateTime.Now;
            record.UserId = userInfo.User.UserName;
            record.UserName = userInfo.User.AliasName;
            record.Org = userInfo.User.Org.Code + userInfo.User.Org.HostId;
            record.OperateType = operationType.ToString();
            record.ResourceName = entitySetName;
            record.CurrentData = currentValues;
            record.OriginalData = originalValues;
            logContext.AddToOperationRecords(record);
            logContext.SaveChanges();

        }

}

4、在程序开始的时候,进行关联

SqlBtmsModel.RecordHandel = SqlLogManager.SaveToDB;

5、以后使用Using(SqlBtmsModel context=new SqlBtmsModel()){.......}或者 Using(SqlBtmsModel context=new SqlBtmsModel(true)){.......}进行数据库的增、删、修改操作时,将自动记录日志,且每操作一条数据,便记录一条日志。若不想记录日志,则可以使用Using(SqlBtmsModel context=new SqlBtmsModel(false)){.......}

原创粉丝点击