Dynamic update for all writes for VehiclePreviousLog

This commit is contained in:
2012-12-07 13:43:05 -05:00
parent ea2d8b4262
commit 6f28fb1621
6 changed files with 69 additions and 35 deletions
+58 -27
View File
@@ -20,6 +20,14 @@ namespace MileageTraker.Web.DAL
{
log.Created = DateTime.Now;
_db.Logs.Add(log);
// update previous log links
var previousLog = SearchPreviousLog(log);
log.VehiclePreviousLog = previousLog;
var nextLog = SearchNextLog(log);
if (nextLog != null)
nextLog.VehiclePreviousLog = log;
_db.SaveChanges();
UpdateCurrentOdometer(log.VehicleId);
@@ -190,60 +198,75 @@ namespace MileageTraker.Web.DAL
return logs;
}
public Log GetPreviousLog(Log current)
public Log SearchPreviousLog(Log current)
{
var vehicleId = current.VehicleId;
var date = current.Date;
var endOdometer = current.EndOdometer;
return GetPreviousLog(endOdometer, vehicleId, date, current.Created);
return SearchPreviousLog(endOdometer, vehicleId, date, current.Created, current.LogId);
}
public Log GetPreviousLog(int endOdometer, string vehicleId, DateTime date, DateTime created)
public Log SearchPreviousLog(int endOdometer, string vehicleId, DateTime date, DateTime created, int? excludeLogId = null)
{
return GetPreviousLogQuery(endOdometer, vehicleId, date, created).FirstOrDefault();
return (from pl in _db.Logs
where pl.VehicleId == vehicleId &&
((pl.Date <= date && pl.EndOdometer < endOdometer)
|| (pl.EndOdometer == endOdometer && pl.Created < created)) &&
pl.LogId != excludeLogId
orderby pl.EndOdometer descending, pl.Created descending
select pl).FirstOrDefault();
}
private IOrderedQueryable<Log> GetPreviousLogQuery(int endOdometer, string vehicleId, DateTime date, DateTime created)
{
return from pl in _db.Logs
where pl.VehicleId == vehicleId &&
((pl.Date <= date && pl.EndOdometer < endOdometer)
|| (pl.EndOdometer == endOdometer && pl.Created < created))
orderby pl.EndOdometer descending, pl.Created descending
select pl;
}
public Log GetNextLog(Log current)
public Log SearchNextLog(Log current)
{
var vehicleId = current.VehicleId;
var date = current.Date;
var endOdometer = current.EndOdometer;
return GetNextLog(endOdometer, vehicleId, date, current.Created);
return SearchNextLog(endOdometer, vehicleId, date, current.Created, current.LogId);
}
public Log GetNextLog(int endOdometer, string vehicleId, DateTime date, DateTime created)
public Log SearchNextLog(int endOdometer, string vehicleId, DateTime date, DateTime created, int? excludeLogId = null)
{
return (from nl in GetLogs()
where nl.VehicleId == vehicleId &&
((nl.Date >= date && nl.EndOdometer > endOdometer)
|| (nl.EndOdometer == endOdometer && nl.Created > created))
|| (nl.EndOdometer == endOdometer && nl.Created > created)) &&
nl.LogId != excludeLogId
orderby nl.EndOdometer ascending, nl.Created ascending
select nl).FirstOrDefault();
}
public void UpdateLog(Log log)
{
var currentLog = GetLog(log.LogId);
_db.Logs.Attach(log);
var original = _db.Logs.Find(log.LogId);
// ignore these properties while updating
log.Created = currentLog.Created;
log.Source = currentLog.Source;
log.UserAgent = currentLog.UserAgent;
log.UserHostAddress = currentLog.UserHostAddress;
log.Created = original.Created;
log.Source = original.Source;
log.UserAgent = original.UserAgent;
log.UserHostAddress = original.UserHostAddress;
_db.Entry(currentLog).CurrentValues.SetValues(log);
// remove from the list
var nextLog =
(from l in _db.Logs
where l.VehiclePreviousLogId == log.LogId
select l).FirstOrDefault();
if (nextLog != null)
nextLog.VehiclePreviousLogId = log.VehiclePreviousLogId;
_db.Entry(currentLog).State = EntityState.Modified;
log.VehiclePreviousLog = null;
log.VehiclePreviousLogId = null;
// add it back in new position
var previousLog = SearchPreviousLog(log);
if (previousLog != null)
log.VehiclePreviousLogId = previousLog.LogId;
var newNextLog = SearchNextLog(log);
if (newNextLog != null)
newNextLog.VehiclePreviousLogId = log.LogId;
_db.Entry(log).State = EntityState.Modified;
_db.SaveChanges();
UpdateCurrentOdometer(log.VehicleId);
@@ -252,6 +275,14 @@ namespace MileageTraker.Web.DAL
public void DeleteLog(int id)
{
var log = _db.Logs.Find(id);
var nextLog =
(from l in _db.Logs
where l.VehiclePreviousLogId == log.LogId
select l).FirstOrDefault();
if (nextLog != null)
nextLog.VehiclePreviousLog = log.VehiclePreviousLog;
_db.Logs.Remove(log);
_db.SaveChanges();
@@ -335,7 +366,7 @@ namespace MileageTraker.Web.DAL
// TODO HACK for testing, delete later
try
{
if (_db.Logs.Count() == 0)
if (!_db.Logs.Any())
return null;
}
catch (NullReferenceException)