ASP.Net MVC 3 Entity Framework 4.1如何重写SaveChanges方法

3
我正在使用Entity Framework 4.1构建一个ASP.Net MVC 3 Web应用程序,采用Database First方法。
我还使用了ADO.NET DbContext生成器来创建POCO类,而不是使用自动生成的Entity对象。当您使用ADO.NET DbContext生成器时,它将创建两个新项目:一个.tt文件,为每个实体生成POCO类;另一个.Context.tt文件,生成一个派生的DbContext类(用于查询和持久化数据)。
在我的应用程序中,我编写了特定实体的审计代码,这些代码在我创建的override SaveChanges()方法内执行。我将此override 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
}

然而,每次我在EDMX Diagram中移动或更新实体,然后保存,我的Context.cs类中的自定义SaveChanges()方法就会被删除。有没有办法阻止这种情况发生,或者也许我应该把我的SaveChanges()方法放在其他地方?请问是否有人可以提供建议?谢谢。
1个回答

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)
}

由于它是部分的,如果需要的话,您可以在许多.cs文件中具有LocumEntities类的一部分,并且它们将被视为一个类。只需确保它们位于相同的命名空间中即可。
永远不要在生成的文件中编写自己的代码...
生成的类通常是部分的,只是为了启用该方式处理自定义代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接