Entity Framework: получение базового типа объекта при изменении внешнего ключа для контрольного журнала.
В настоящее время я работаю над проектом, в котором требуется регистрировать изменения для каждого отдельного свойства объекта. Многие из сущностей имеют отношение "1 ко многим" с типом искомого значения, и когда это изменится, я до сих пор могу отследить, что "1" был изменен на "2". То, что я пытаюсь сделать, это перевести число в более читаемое значение.
У меня есть фрагмент кода ниже, который я думал, что будет работать, но это не так:(
namespace DomainClasses
{
public interface IAuditDescribable
{
String GetAuditDescription();
}
public abstract class BaseEntity
{
public Int32 Id { get; set; }
}
public class Car : BaseEntity
{
public String Vrn { get; set; }
public Int32? TransmissionId { get; set; }
public virtual Transmission Transmission { get; set; }
}
public class Transmission : BaseEntity, IAuditDescribable
{
public String Name { get; set; }
public String GetAuditDescription()
{
return Name;
}
}
}
namespace AuditTrailTwo
{
public class AuditContext : DbContext
{
public DbSet<Car> Cars { get; set; }
public DbSet<Transmission> Transmissions { get; set; }
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var octx = ((IObjectContextAdapter)this).ObjectContext;
var changes = octx.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
foreach (var change in changes)
{
var changedProperties = change.GetModifiedProperties();
var associationSets = change.EntitySet.EntityContainer.AssociationSets;
foreach (var changedProperty in changedProperties)
{
CurrentValueRecord current = change.CurrentValues;
var newValue = current.GetValue(
current.GetOrdinal(changedProperty));
DbDataRecord original = change.OriginalValues;
var oldValue = original.GetValue(
original.GetOrdinal(changedProperty));
var aSet = associationSets
.Where(x => x.ElementType.IsForeignKey)
.FirstOrDefault(x => x.ElementType.Constraint.ToProperties[0].Name == changedProperty);
if (aSet != null)
{
var targetEnd = aSet.AssociationSetEnds.GetValue(aSet.Name+"_Target", true);
//This type is always null because the 'FullName' returns: 'AuditTrailTwo.Transmission'
//and not 'DomainClasses.Transmission' as I was expecting.
var type = Type.GetType(targetEnd.EntitySet.ElementType.FullName);
if (type != null)
{
var typeSet = Set(type);
var newEntry = typeSet.Find(newValue) as IAuditDescribable;
var newEntryValue = newEntry.GetAuditDescription();
var oldEntry = typeSet.Find(oldValue) as IAuditDescribable;
var oldEntryValue = oldEntry.GetAuditDescription();
}
}
}
}
return base.SaveChanges();
}
}
}
Я просмотрел множество постов, в которых обсуждается аудит с помощью структуры сущностей, но я до сих пор не нашел способа достичь того, что я пытаюсь сделать. Я надеюсь, что это просто потому, что я что-то упускаю.
Любая помощь приветствуется.
1 ответ
Вы можете использовать аспектно-ориентированное программирование для обработки, когда свойство изменилось. http://www.postsharp.net/