Ответ 1
Мнение: Триггеры похожи на скрытое поведение, если вы не ищете их, вы обычно не поймете, что они есть. Мне также нравится поддерживать DB как "тупой", насколько это возможно при использовании EF, поскольку я использую EF, поэтому моей команде не требуется поддерживать код SQL.
Для моего решения (сочетание ASP.NET WebForms и MVC в С# с бизнес-логикой в другом проекте, который также содержит DataContext):
Недавно у меня была аналогичная проблема, и хотя для моей ситуации она была более сложной (DatabaseFirst, поэтому требуется специальный файл TT), решение в основном одинаков.
Я создал интерфейс:
public interface ITrackableEntity
{
DateTime CreatedDateTime { get; set; }
int CreatedUserID { get; set; }
DateTime ModifiedDateTime { get; set; }
int ModifiedUserID { get; set; }
}
Затем я просто реализовал этот интерфейс для любых объектов, в которых я нуждался (поскольку мое решение было DatabaseFirst, я обновил файл TT, чтобы проверить, были ли в таблице эти четыре столбца, и если так добавил интерфейс к выходу).
UPDATE: здесь мои изменения в файле TT, где я обновил метод EntityClassOpening()
:
public string EntityClassOpening(EntityType entity)
{
var trackableEntityPropNames = new string[] { "CreatedUserID", "CreatedDateTime", "ModifiedUserID", "ModifiedDateTime" };
var propNames = entity.Properties.Select(p => p.Name);
var isTrackable = trackableEntityPropNames.All(s => propNames.Contains(s));
var inherits = new List<string>();
if (!String.IsNullOrEmpty(_typeMapper.GetTypeName(entity.BaseType)))
{
inherits.Add(_typeMapper.GetTypeName(entity.BaseType));
}
if (isTrackable)
{
inherits.Add("ITrackableEntity");
}
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial class {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", String.Join(", ", inherits)));
}
Осталось только добавить следующее к моему частичному классу DataContext:
public override int SaveChanges()
{
// fix trackable entities
var trackables = ChangeTracker.Entries<ITrackableEntity>();
if (trackables != null)
{
// added
foreach (var item in trackables.Where(t => t.State == EntityState.Added))
{
item.Entity.CreatedDateTime = System.DateTime.Now;
item.Entity.CreatedUserID = _userID;
item.Entity.ModifiedDateTime = System.DateTime.Now;
item.Entity.ModifiedUserID = _userID;
}
// modified
foreach (var item in trackables.Where(t => t.State == EntityState.Modified))
{
item.Entity.ModifiedDateTime = System.DateTime.Now;
item.Entity.ModifiedUserID = _userID;
}
}
return base.SaveChanges();
}
Обратите внимание, что я сохранял текущий идентификатор пользователя в приватном поле класса DataContext каждый раз, когда я его создавал.