ASP.Net MVC 3 Entity Framework 4.1 Переопределить SaveChanges

Я создаю веб-приложение ASP.Net MVC 3 с Entity Framework 4.1. Я использую подход Database First.

Я также использовал ADO.NET DbContext Generator для создания классов POCO, в отличие от использования автоматически сгенерированных объектов Entity Objects. Когда вы используете ADO.NET DbContext Generator, он создает два новых элемента: файл .tt, который создает классы POCO для каждой сущности, а также < strong>.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, а затем сохраняю, мой пользовательский метод SaveChanges() внутри класса Context.cs удаляется. Можно ли как-то предотвратить это или, может быть, мне следует поместить свой метод SaveChanges() в другое место?

Может кто-нибудь посоветовать?

Спасибо.


person tcode    schedule 14.06.2012    source источник


Ответы (1)


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

поскольку он частичный, вы можете иметь часть класса LocumEntities во многих файлах .cs, если хотите, они будут рассматриваться как один класс. Просто убедитесь, что они находятся в одном пространстве имен.

Никогда не пишите свой собственный код в сгенерированном файле...

Сгенерированные классы обычно являются частичными только для того, чтобы таким образом можно было обрабатывать пользовательский код.

person Raphaël Althaus    schedule 14.06.2012