我正在使用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
}
但是,无论何时我在 EDMX图表中移动或更新实体,然后保存,我都会删除Context.cs类中的自定义 SaveChanges()方法。 有什么方法可以阻止这种情况发生,或者我应该把我的 SaveChanges()方法放到别处吗?
有人可以提出建议吗?
感谢。
答案 0 :(得分: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类的一部分,它们将被视为一个类。请确保它们位于相同的命名空间中。
永远不要在生成的文件中编写自己的代码......
生成的类通常只是为了使这种方式能够处理自定义代码。