如何在模型中覆盖DBContext.SaveChanges()

时间:2013-09-29 19:20:32

标签: c# entity-framework

我有一个问题,我想覆盖SaveChanges(),因为我需要检查一些保存到数据库的值,并在保存之前更改它们

我知道我可以覆盖SaveChanges()中的DBContext

var changeSet = ChangeTracker.Entries<Page>();
if (changeSet != null)
{
    foreach (var entry in changeSet)
    {
        switch (entry.State)
        {
            case System.Data.EntityState.Added:
                if (((Page)entry.Entity).Parent_PageID == -1)
                    ((Page)entry.Entity).Parent_PageID = null;
            break;
        }
    }
}

但如果我需要在多个模型上执行此操作,这将很快变得混乱。

我如何按模型执行此操作?

1 个答案:

答案 0 :(得分:1)

在这里回答我自己的问题,因为我没有找到任何帮助,所以它可能有助于其他人下线。这似乎是分享这个的最佳场所。


使用以下声明确保您具有某种基本模型(或界面):

public class BaseModel
{
    public virtual void OnSaveChanges<T>(T Obj)
    {

    }
}

在派生模型中添加覆盖:

public class Page : BaseModel
{
    //property declarations

    public override void OnSaveChanges<T>(T Obj)
    {
        base.OnSaveChanges<T>(Obj);
        Page model = Obj as Page;

        //Do something with the object.
        if (model.Parent_PageID == -1)
            model.Parent_PageID = null;

    }
}

将以下内容添加到派生的DBContext类中:

public override int SaveChanges()
{
    foreach (var changeSet in ChangeTracker.Entries())
    {
        var type = Type.GetType(changeSet.Entity.GetType().ToString());
        if (type != null)
            BaseModel Obj = (BaseModel)Convert.ChangeType(changeSet.Entity, type);
            Obj.OnSaveChanges(changeSet.Entity);
        }
    }            
    return base.SaveChanges();
}

现在,对于SaveChanges()派生的所有模型,我们会调用BaseModel,以便您进行最后一分钟的更改。

注意:有时候你可以使用var的getter或setter,但由于我使用外键的问题,在这种情况下我无法使用。

这可以很容易地适应添加AfterSave事件等。

HTH其他人。