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/

Другие вопросы по тегам