3

Entity Framework 4.1 で ASP.Net MVC 3 Web アプリケーションを構築しています。データベースファーストのアプローチを使用しています。

自動生成されたエンティティ オブジェクトを使用するのではなく、POCO クラスを作成するためにADO.NET DbContext Generatorも使用しました。ADO.NET DbContext Generatorを使用すると、エンティティごとに POCO クラスを生成する .tt ファイル派生した DbContext クラスを生成する.Context.ttファイル (データのクエリと永続化に使用)。

私のアプリケーションでは、特定のエンティティに対して監査を実行するコードを作成しました。このコードは、作成したオーバーライド 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()メソッドを別の場所に配置する必要がありますか?

誰かアドバイスしてもらえますか?

ありがとう。

4

1 に答える 1

5

Context.cs はクラスではなく、内部に 1 つ (またはゼロ、または多数) のクラスを含むファイルです。

たとえばCustomContext.cs、新しい 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 クラスの一部を含めることができます。これらは 1 つのクラスと見なされます。それらが同じ名前空間にあることを確認してください。

生成されたファイルに独自のコードを記述しないでください...

生成されたクラスは通常、カスタム コードを処理できるようにするためだけに部分的です。

于 2012-06-14T13:16:27.183 に答える