I want to implement Repository Pattern in my ASP.NET MVC + EF 4.3 project.
Right now my DBContext class has an override to SaveChanges that receives a “userid” parameter in order to do Audit Trail.
Example:
// This is overridden to prevent someone from calling SaveChanges without specifying the user making the change
public override int SaveChanges()
{
throw new InvalidOperationException("User ID must be provided");
}
public int SaveChanges(int userId)
{
// Get all Added/Deleted/Modified entities (not Unmodified or Detached)
foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == System.Data.EntityState.Added || p.State == System.Data.EntityState.Deleted || p.State == System.Data.EntityState.Modified))
{
// For each changed record, get the audit record entries and add them
foreach (AuditLog x in GetAuditRecordsForChange(ent, userId))
{
this.AuditLogs.Add(x);
}
}
// Call the original SaveChanges(), which will save both the changes made and the audit records
return base.SaveChanges();
}
Now, my RepositoryBase class has something like this:
public class RepositoryBase<C> : IDisposable
where C : DbContext, new()
{
private C _DataContext;
public virtual C DataContext
{
get
{
if (_DataContext == null)
{
_DataContext = new C();
this.AllowSerialization = true;
//Disable ProxyCreationDisabled to prevent the "In order to serialize the parameter, add the type to the known types collection for the operation using ServiceKnownTypeAttribute" error
}
return _DataContext;
}
}
My question is how can I expose the SaveChanges(int) method inside my RepositoryBase class?
Any clue?
You’re going to need to use your actual DbContext in your generic definition instead of DbContext base class. Then you’ll be able to call your overridden function