每个实体框架添加/更新/删除操作的Fire方法

时间:2015-09-24 07:54:09

标签: c# entity-framework

如果我遗漏了明显的东西,请道歉!但我希望Entity Framework能够在所有Add / Update操作上执行泛型方法。

我正在构建一个自定义SaveHistory功能,它将T作为一个param,它实际上是正在处理的Entity Framework对象。

核心方法:

//TODO - Requires additional logic
public void SaveHistory<T>(T type, [CallerFilePath]string callerFilePath = "")
{
    //Caller File Path just returns the location of where the method was executed
    //This enables us to retrieve the module location

    //Get the Name of the class(Type that's been passed in)
    var className = typeof(T).Name;

    //Get a collection of module names
    var enumNames = Enum.GetNames(typeof (Department));

    //Does any of the module names equal the executing assembly
    if (enumNames.Any(callerFilePath.Contains))
    {
        //Now I can search the string to see if an action came from a module
    }
    else
    {
        //If not it could be an error or calling from a core object
        //Needs work
    }
}

我想问题是,我可以集中上述方法来触发所有添加/更新/删除操作吗?

如果无法做到这一点,有人会建议更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您可以使用ChangeTracker DbContext属性访问正在保存的实体 在您的实施中覆盖SaveChanges

public override int SaveChanges()
{
   foreach (var e in ChangeTracker.Entries())
   {
       SaveHistory(e.Entity);
   }
   return base.SaveChanges();
}

如果您想在保存之前验证实体,那么您也可以通过overriding ValidateEntity

访问它

答案 1 :(得分:0)

是的,您只需要覆盖dbContext类中实体框架的默认SaveChanges方法,然后执行您想要执行的操作。无论何时拨打Context.SaveChanges(),您的覆盖方法都会调用,

类似这样的事情

public override int SaveChanges() {

  // do your changes here
  return base.SaveChanges();
}