Наша компания новичок в использовании EF, и я был бы признателен за любое руководство / совет по нашей проблеме. В этом проекте мы используем EF 6, Visual Studio 2015, подход сначала к базе данных и службу RESTful (это RESTful API, использующий JSON, а не общий API, нам нужен только общий метод ведения журнала аудита). Нам необходимо внедрить аудит, и мы проводим расследование с использованием функции ChangeTracker. Идея состоит в том, чтобы создать универсальный метод, который может принимать любую сущность. Вот что у нас есть на данный момент;

Конец контроллера Shift 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....
        }
    }

Возможен ли этот вариант для нас, чтобы выполнить наши требования к журналу аудита? Код не был протестирован, поэтому я уверен, что нам тоже нужны некоторые указатели для кодирования. Если это не жизнеспособный вариант для достижения нашей цели, не могли бы вы порекомендовать вариант, который может быть реализован с использованием подхода «сначала база данных»? Заранее спасибо!!

0
BabyDoll 10 Ноя 2017 в 09:55

1 ответ

Лучший ответ

Выбрав другой подход к тому, что мы искали в Google, мы наткнулись на эта ссылка, которая дала нам решение нашей проблемы. Оставляем это здесь, чтобы сэкономить время другим разработчикам :-)

0
BabyDoll 13 Ноя 2017 в 11:00