Я пытался реализовать 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); }
}
}
Скрыт Я не мог создать тег FrameLog – Malkin
Начал отладку через источник FrameLog, кажется, что он сравнивает две пары значений и ничто не изменилось (как старые, так и новые значения показывают новое значение). Не уверен. Что мне здесь не хватает. – Malkin
Этот последний комментарий заставил меня поверить, что это не связано с 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