3

我正在使用 Entity Framework 4.1 构建一个 ASP.Net MVC 3 Web 应用程序。我正在使用数据库优先方法。

我还使用了ADO.NET DbContext Generator来创建 POCO 类,而不是使用自动生成的实体对象。当您使用ADO.NET DbContext Generator时,它将创建两个新项目,一个为每个实体生成 POCO 类的.tt文件,以及一个.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
}

但是,只要我什至在EDMX Diagram中移动或更新实体,然后保存,我在 Context.cs 类中的自定义SaveChanges()方法就会被删除。有什么办法可以阻止这种情况发生,或者我应该把我的SaveChanges()方法放在别处?

有人可以建议吗?

谢谢。

4

1 回答 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 类的一部分,它们将被视为一个类。只要确保它们在同一个命名空间中。

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

生成的类通常是部分的,只是为了启用这种方式来处理自定义代码。

于 2012-06-14T13:16:27.183 回答