1

我有一个问题,我想覆盖 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;
        }
    }
}

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

每个模型我如何做到这一点?

4

1 回答 1

1

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


确保您具有某种具有以下声明的基本模型(或接口):

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 其他人。

于 2013-09-29T19:20:32.233 回答