2017-11-10 3 views
0

저희 회사는 EF를 처음 사용하기 때문에 모든 문제에 대해 조언을 주시면 감사하겠습니다. 이 프로젝트에서 우리는 EF 6, Visual Studio 2015, 데이터베이스의 첫 번째 접근 방식 및 RESTful 서비스 (JSON을 일반 API가 아닌 RESTful API로 사용하고 있으며 감사 로깅 방식 만 일반화해야합니다)을 사용하고 있습니다. 우리는 감사를 구현할 필요가 있으며 ChangeTracker 기능을 사용하여 조사하고 있습니다. 아이디어는 모든 엔티티를 받아 들일 수있는 일반적인 메소드를 만드는 것입니다. 여기에 우리가 지금까지 가지고있는 것이 있습니다. 시프트 API 컨트롤러의데이터베이스를 사용한 ChangeTracker 구현

끝이 같은

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.... 
     } 
    } 

이 우리의 감사 로깅 요구 사항에 대한 추구하는 우리에게 실현 가능한 옵션인가? 코드는 테스트되지 않았으므로 코드를 현명하게 코딩해야합니다. 이것이 우리의 목표를 달성하기위한 실행 가능한 옵션이 아니라면, 데이터베이스의 첫 번째 접근법으로 구현할 수있는 옵션을 권장 할 수 있습니까? 미리 감사드립니다 !!

답변

0

우리가 인터넷 검색에 대해 다른 접근 방식을 취한 후 우리는 우리 문제에 대한 해결책을 준 this 링크에 왔습니다. 희망을 갖고 다른 개발자를 잠시 저장하려면 여기에 남겨 두십시오 :-)

관련 문제