当社はEFを初めて使用しており、私たちの問題に関するアドバイスやご指摘をいただければ幸いです。このプロジェクトでは、EF 6、Visual Studio 2015、データベースの最初のアプローチとRESTfulサービス(これはジェネリックAPIではなくJSONを使用した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....
}
}
これは、私たちは私たちの監査ログの要件のために追求するための実現可能な選択肢ですか?コードはテストされていませんので、コードを賢明にコーディングする必要があります。これが目標を達成するための実行可能な選択肢ではない場合、データベースの最初のアプローチで実装できるオプションをお勧めしますか?前もって感謝します!!