我有一个问题,我想覆盖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;
}
}
}
但如果我需要在多个模型上执行此操作,这将很快变得混乱。
我如何按模型执行此操作?
答案 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
事件等。