代码之家  ›  专栏  ›  技术社区  ›  BabyDoll

使用数据库优先appraoch实现ChangeTracker

  •  0
  • BabyDoll  · 技术社区  · 7 年前

    我们公司是新使用EF的,如果您能就我们的问题提供任何指导/建议,我将不胜感激。在这个项目中,我们使用EF 6,Visual Studio 2015,一种数据库优先的方法和RESTful服务(这是一种使用JSON的RESTful API,不是通用API,我们只需要审计日志记录方法是通用的)。我们需要实施审计,并正在使用ChangeTracker功能进行调查。其想法是创建一个可以接受任何实体的通用方法。以下是我们目前的情况;

    换班结束API控制器:

    public class EndOfShiftsController : ApiController
    {
        private iSuiteEntities db = new iSuiteEntities();    
        // POST: api/EndOfShifts/post
        [Route("api/EndOfShift/post")]
        [ResponseType(typeof(EndOfShift))]
        public async Task<IHttpActionResult> PostEndOfShift_Post(EndOfShiftDto endOfShift)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
    
            EndOfShift endofshift = new EndOfShift()
            {
                EndOfShiftID = endOfShift.EndOfShiftID,
                EndOfShiftDate = endOfShift.EndOfShiftDate,
                EquipmentID = endOfShift.EquipmentID,
                StartHours = endOfShift.StartHours,
                EndHours = endOfShift.EndHours,
                CreatedBy = endOfShift.CreatedBy,
                CreateDate = DateTime.Now,
                Active = true
            };
    
            try
            {
                if (!endOfShift.ToDelete)
                {
                    if (EndOfShiftExists(endOfShift.EndOfShiftID))
                    {
                        var update = db.EndOfShifts.Find(endOfShift.EndOfShiftID);
                        update.EndOfShiftDate = endofshift.EndOfShiftDate;
                        update.EquipmentID = endofshift.EquipmentID;
                        update.StartHours = endOfShift.StartHours;
                        update.EndHours = endOfShift.EndHours;
                        db.Entry(update).State = EntityState.Modified;
    
     //try calling the audit log method here/////////////////////////////////
                        AuditsController.GetAuditLogData(endofshift, endOfShift.EndOfShiftID, endOfShift.CreatedBy);
                        await db.SaveChangesAsync();
                    }
                    else
                    {
                        db.EndOfShifts.Add(endofshift);
                        await db.SaveChangesAsync();
                    }
                }
                else
                {
                    EndOfShift delete = db.EndOfShifts.Find(endOfShift.EndOfShiftID);
                    if (delete == null)
                    {
                        return NotFound();
                    }
                    else
                    {
                        delete.Active = false;
                        db.Entry(delete).State = EntityState.Modified;
                        await db.SaveChangesAsync();
                    }
                }
    
    
    
                return Ok("Success");
            }   
            catch(Exception ex)
            {
                return Ok(ex.Message);
            }            
            //return CreatedAtRoute("DefaultApi", new { id = endOfShift.EndOfShiftID }, endOfShift);
        }
    

    通用审计日志记录方法如下:

    public class AuditsController : ApiController
    {
        private static iSuiteEntities dbContext = new iSuiteEntities();
        private static iSuiteEntities db = new iSuiteEntities();
    
        //write Audit log        
        public static async void GetAuditLogData<T>(T entity, int recID, int modByID) where T : new ()
        {
            try
            {                
                var changeTrack = dbContext.ChangeTracker.Entries().Where(p => p.State == EntityState.Added || p.State == EntityState.Deleted || p.State == EntityState.Modified);
                foreach (var entry in changeTrack)
                {
                    if (entry.Entity != null)
                    {
                        string entityName = string.Empty;
                        string state = string.Empty;
                        switch (entry.State)
                        {
                            case EntityState.Modified:
                                entityName = ObjectContext.GetObjectType(entry.Entity.GetType()).Name;
                                state = entry.State.ToString();
                                foreach (string prop in entry.OriginalValues.PropertyNames)
                                {
                                    object currentValue = entry.CurrentValues[prop];
                                    object originalValue = entry.OriginalValues[prop];
                                    if (!currentValue.Equals(originalValue))
                                    {
                                        Audit auditEntry = new Audit()
                                        {
                                            recordID = recID,
                                            tableName = entityName,
                                            fieldName = prop,
                                            oldValue = Convert.ToString(originalValue),
                                            editReason = "Update",
                                            modifiedBy = modByID,
                                            modifiedDate = DateTime.Now
                                        };
    
                                        db.Audits.Add(auditEntry);
                                        await db.SaveChangesAsync();
                                    }
                                }
                                break;
                                //data addition is not required to be logged/////                            
                            case EntityState.Deleted:
                                entityName = ObjectContext.GetObjectType(entry.Entity.GetType()).Name;
                                state = entry.State.ToString();
                                foreach (string prop in entry.OriginalValues.PropertyNames)
                                {
                                    Audit auditEntry = new Audit()
                                    {
                                        recordID = recID,
                                        tableName = entityName,
                                        fieldName = prop,
                                        oldValue = Convert.ToString(entry.OriginalValues[prop]),
                                        editReason = "Delete",
                                        modifiedBy = modByID,
                                        modifiedDate = DateTime.Now
                                    };
    
                                    db.Audits.Add(auditEntry);
                                    await db.SaveChangesAsync();                                    
                                }
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                //handle exception here....
            }
        }
    

    这对我们追求审计日志记录要求是否可行?代码还没有经过测试,所以我确信我们也需要一些代码方面的指针。如果这不是实现我们目标的可行选项,您能推荐一个可以使用数据库优先方法实现的选项吗?提前感谢!!

    1 回复  |  直到 7 年前
        1
  •  0
  •   BabyDoll    7 年前

    在对我们在谷歌上搜索的内容采取了不同的方法后,我们发现 this 链接为我们提供了问题的解决方案。把这个放在这里,希望能为其他开发人员节省一些时间:-)

    推荐文章