ASP.Net MVC 3实体框架4.1覆盖SaveChanges

tco*_*ode 3 overriding savechanges edmx entity-framework-4.1 asp.net-mvc-3

我正在使用Entity Framework 4.1构建一个ASP.Net MVC 3 Web应用程序.我正在使用Database First方法.

我还使用了ADO.NET DbContext Generator来创建POCO类,而不是使用自动生成的实体对象.当您使用ADO.NET DbContext Generator时,它将创建两个新项,一个.tt文件,为每个实体生成POCO类,还有一个.Context.tt文件,生成派生的DbContext类(用于查询和保存数据).

在我的应用程序中,我编写了代码来执行特定实体的审计,此代码在我创建的覆盖SaveChanges()方法内执行.我已将此覆盖SaveChanges()方法放在Context.cs类中,如下所示,它可以很好地工作

public partial class LocumEntities : DbContext
{
    public LocumEntities()
        : base("name=LocumEntities")
    {
    }

    public override int SaveChanges()
    {
        //Audit Code Executes in Here
        return base.SaveChanges();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public DbSet<Audit> Audits { get; set; }
    public DbSet<Form> Forms { get; set; }
    //Other DbSets
}
Run Code Online (Sandbox Code Playgroud)

但是,无论何时我甚至在EDMX图中移动或更新实体,然后保存,我都会删除Context.cs类中的自定义SaveChanges()方法.有什么方法可以阻止这种情况发生,或者我应该把我的SaveChanges()方法放在别处吗?

有人可以建议吗?

谢谢.

Rap*_*aus 5

Context.cs不是一个类,它是一个文件,里面有一个(或零个或多个)类.

只需添加一个新的cs文件,例如CustomContext.cs,

并添加

public partial class LocumEntities : DbContext {

    public override int SaveChanges()
    {
        //Audit Code Executes in Here
        return base.SaveChanges();
    }

    //other custom code (not generated by T4)
}
Run Code Online (Sandbox Code Playgroud)

因为它是部分的,如果你愿意,你可以在许多.cs文件中使用LocumEntities类的一部分,它们将被视为一个类.请确保它们位于相同的命名空间中.

永远不要在生成的文件中编写自己的代码......

生成的类通常是部分的,只是为了使这种方式能够处理自定义代码.