2013-09-12 2 views
1

Я пытался реализовать FrameLog от Martin Eden. Это похоже на идеальное соответствие некоторым требованиям, которые я считал кодированием, но осознанная расширяемость будет ограничена, и это займет много времени.Контекст FrameLog сохраняет изменения, но не регистрирует изменения

Так я реализовал метод Сохранить контекст в моей DbContext, используя новый метод, называемый Save(string username) называть Logger.SaveChanges(username, SaveOptions.AcceptAllChangesAfterSave);

В то время как это сохраняет свои объекты в базу данных, я не получаю журнал изменений. У кого-нибудь есть опыт с этим, который может протянуть руку?

Вот мои классы: OppsContext.cs

public OppsContext() 
     : base("Name=OppsContext") 
    { 
     Logger = new FrameLogModule<ChangeSet, string>(new ChangeSetFactory(), FrameLogContext); 
    } 
    #region logging 
    public DbSet<ChangeSet> ChangeSets { get; set; } 
    public DbSet<ObjectChange> ObjectChanges { get; set; } 
    public DbSet<PropertyChange> PropertyChanges { get; set; } 

    public readonly FrameLogModule<ChangeSet, string> Logger; 
    public IFrameLogContext<ChangeSet, string> FrameLogContext 
    { 
     get { return new OppsContextAdapter(this); } 
    } 
    public HistoryExplorer<ChangeSet, string> HistoryExplorer 
    { 
     get { return new HistoryExplorer<ChangeSet, string>(FrameLogContext); } 
    } 

    public void Save(string author) 
    { 
     try 
     { 

      Logger.SaveChanges(author, SaveOptions.AcceptAllChangesAfterSave); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    } 

OppsContextAdapter.cs

 public class OppsContextAdapter : DbContextAdapter<ChangeSet, string> 
{ 
    private OppsContext context; 

    public OppsContextAdapter(OppsContext context) 
     : base(context) 
    { 
     this.context = context; 
    } 

    public override IQueryable<IChangeSet<string>> ChangeSets 
    { 
     get { return context.ChangeSets; } 
    } 
    public override IQueryable<IObjectChange<string>> ObjectChanges 
    { 
     get { return context.ObjectChanges; } 
    } 
    public override IQueryable<IPropertyChange<string>> PropertyChanges 
    { 
     get { return context.PropertyChanges; } 
    } 
    public override void AddChangeSet(ChangeSet changeSet) 
    { 
     context.ChangeSets.Add(changeSet); 
    } 

    public override Type UnderlyingContextType 
    { 
     get { return typeof(OppsContext); } 
    } 
} 
+0

Скрыт Я не мог создать тег FrameLog – Malkin

+0

Начал отладку через источник FrameLog, кажется, что он сравнивает две пары значений и ничто не изменилось (как старые, так и новые значения показывают новое значение). Не уверен. Что мне здесь не хватает. – Malkin

+0

Этот последний комментарий заставил меня поверить, что это не связано с FrameLog, если у кого-то есть эта проблема за пределами этой библиотеки. См. Ответ ниже, поскольку FrameLog использует ObjectStateEntry [ObjectStateEntry.OriginalValues] (http://msdn.microsoft.com/en-us/library/system.data.objects.objectstateent.originalvalues.aspx) и [ObjectStateEntry.CurrentValues] (http : //msdn.microsoft.com/en-us/library/system.data.objects.objectstateentry.currentvalues.aspx). – Malkin

ответ

2

Мой плохо, узнал, что это была моя вина. Для всех, кто пришел сюда с подобной проблемой;

Проверьте, что вы загружаете объект из базы данных, прежде чем применять к нему новые значения. Этот контекст - это тот, который должен будет загружать исходные значения, а не данные сообщения или новый объект, который вы создали из него (должен быть Entity).

+1

Я был вне цикла на некоторое время - извините, что не помог раньше. Да, Entity Framework будет отслеживать изменения только объекта, когда он привязан к контексту базы данных, а FrameLog запрашивает EF для записи информации о изменениях в журнал. –

+0

Не могли бы вы привести пример того, как вы его решили? См. Также https://bitbucket.org/MartinEden/framelog/issue/45/ –

Смежные вопросы