Как предотвратить удаление кода come в DbContext при обновлении модели в database first Entity Framework

#c# #asp.net-mvc #entity-framework #ef-database-first

#c# #asp.net-mvc #entity-framework #ef-database-first

Вопрос:

У меня есть база DbContext данных, и я добавил в класс некоторый код, связанный с аудитом DbContext , но когда я обновляю модель, она удаляет написанный мной код в DbContext классе. Пожалуйста, скажите мне, как сохранить этот код даже после обновления модели.

Вот мой код, и я добавил комментарии, которые код удаляет после обновления модели:

 public partial class MyDbContext : DbContext
{
    public MyDbContext()
        : base("name=ODbContext")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<AspNotification> AspNotifications { get; set; }
    public virtual DbSet<ASPAudit> ASPAudit { get; set; }

    // this code is removed whenever I update model
    public override int SaveChanges()
    {
         var addedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList();
         
        int changes = base.SaveChanges();

        foreach (var entry in addedEntries)
        {
           ...some code
        }

        base.SaveChanges();

        return changes;
    }
}
 

Было бы здорово, если бы кто-нибудь помог мне

Комментарии:

1. Это частичный класс, который вы можете добавить к определению в другом исходном файле.

Ответ №1:

Если вы посмотрите на верхнюю часть этого сгенерированного класса, вы увидите:

 //------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
 

Это означает, что этот класс будет автоматически генерироваться при каждом обновлении.

Если сгенерированные классы есть partial , вы можете создавать и добавлять свои расширения / изменения в другую половину partial класса (например MyDbContextPartial.cs ).

 // file MyDbContextPartial.cs
public partial class MyDbContext
{
    public override int SaveChanges()
    {
         var addedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList();
         
        int changes = base.SaveChanges();
        foreach (var entry in addedEntries)
        {
           ...some code
        }

        base.SaveChanges();
        return changes;
    }
}
 

Комментарии:

1. Могу ли я создать его с тем же именем класса, что и ‘MyDbContext’?

2. Как получить доступ к DbSet<Entity> в частичном классе.

3. @DeveloperDJ вы можете прочитать о частичных классах , они в основном представляют собой один класс, разделенный пополам (или много классов).