我一直试图通过Martin Eden实施FrameLog。它看起来完全符合我自己编写的一些要求,但实现的可扩展性将受到限制,并且需要很长时间。
所以我在DbContext中实现了Save上下文方法,使用一个名为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 :(得分:2)
我的坏,发现这是我自己的错。对于那些带着类似问题来到这里的人;
在将新值应用于数据库之前,检查是否正在从数据库加载对象。此上下文是需要加载原始值的上下文,而不是您从中创建的帖子数据或新对象(应该是实体)。