Erstellen eines Prüfpfads mit Entity Framework 5 und MVC 4

Ich erstelle eine MVC 4-Anwendung mit EF 5. Ich muss einen Audit-Trail durchführen, dh alle Änderungen protokollieren, die Endbenutzer vornehmen.

Ich habe diese Frage einige Male gestellt, aber noch nie eine zufriedenstellende Antwort erhalten. Ich füge also viel mehr Details hinzu, in der Hoffnung, irgendwohin zu gelangen.

Derzeit habe ich mehrere Repositories

dh

 public class AuditZoneRepository : IAuditZoneRepository
    {
        private AISDbContext context = new AISDbContext();


        public int Save(AuditZone model, ModelStateDictionary modelState)
        {
            if (model.Id == 0)
            {
                context.AuditZones.Add(model);
            }
            else
            {
                var recordToUpdate = context.AuditZones.FirstOrDefault(x => x.Id == model.Id);
                if (recordToUpdate != null)
                {
                    recordToUpdate.Description = model.Description;
                    recordToUpdate.Valid = model.Valid;
                    recordToUpdate.ModifiedDate = DateTime.Now;
                }
            }

            try
            {
                context.SaveChanges();
                return 1;
            }
            catch (Exception ex)
            {
                modelState.AddModelError("", "Database error has occured.  Please try again later");
                return -1;
            }
        }
    }



    public class PostcodesRepository : IPostcodesRepository
    {
        private AISDbContext context = new AISDbContext();


        public int Save(Postcodes model, ModelStateDictionary modelState)
        {
            if (model.Id == 0)
            {
                context.Postcodes.Add(model);
            }
            else
            {
                var recordToUpdate = context.Postcodes.FirstOrDefault(x => x.Id == model.Id);
                if (recordToUpdate != null)
                {
                    recordToUpdate.Suburb = model.Suburb;
                    recordToUpdate.State = model.State;
                    recordToUpdate.Postcode = model.Postcode;
                    recordToUpdate.AuditZoneId = model.AuditZoneId;
                    recordToUpdate.ModifiedDate = DateTime.Now;
                }
            }

            try
            {
                context.SaveChanges();
                return 1;
            }
            catch (Exception ex)
            {
                modelState.AddModelError("", "Database error has occured.  Please try again later");
                return -1;
            }
        }



    }

Jetzt weiß ich, dass ich den Code hinzufügen muss, um zu überprüfen, ob es Änderungen gibt, die ich beim Versuch des Speicherns hinzufügen muss. Vor dem context.SaveChanges ().

Aber momentan habe ich 10 Repos. Ich möchte nicht wirklich Code zu 10 verschiedenen Stellen hinzufügen. Da dieser Code genau das gleiche tun wird. Ich möchte irgendwie eine Basisklasse haben, von der die Repos erben.

irgendeine Hilfe? Beispielcode? irgendwelche Hinweise?

wäre dankbar. Ich bin sicher, andere Leute hätten das schon früher gemacht

Ich kopiere meine Schlüssel, Beziehungen und Tabellen so

 public class AuditZoneMap : EntityTypeConfiguration<AuditZone>
    {
        public AuditZoneMap()
        {
            // Primary Key
            HasKey(t => t.Id);


            // Properties
            Property(t => t.Description)
                .HasMaxLength(100);


            // Table & Column Mappings
            ToTable("AuditZone");
            Property(t => t.Id).HasColumnName("Id");
            Property(t => t.Description).HasColumnName("Description");
            Property(t => t.Valid).HasColumnName("Valid");          
            Property(t => t.CreatedDate).HasColumnName("CreatedDate");
            Property(t => t.CreatedBy).HasColumnName("CreatedBy");
            Property(t => t.ModifiedDate).HasColumnName("ModifiedDate");
            Property(t => t.ModifiedBy).HasColumnName("ModifiedBy");

            // Relationships        
            HasOptional(t => t.CreatedByUser)
               .WithMany(t => t.CreatedByAuditZone)
               .HasForeignKey(d => d.CreatedBy);

            HasOptional(t => t.ModifiedByUser)
                .WithMany(t => t.ModifiedByAuditZone)
                .HasForeignKey(d => d.ModifiedBy);


        }
    }

Antworten auf die Frage(5)

Ihre Antwort auf die Frage