0

我想在ASP.NET MVC + EF 4.3项目中实现仓库模式。EF仓库模式与ChangeTracker

现在我的DBContext类对SaveChanges有一个覆盖,它接收一个“userid”参数以执行Audit Trail。

例子:

// 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(); 
      } 

现在,我RepositoryBase类有这样的事情:

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

我的问题是我怎么可以公开我的RepositoryBase类中的方法SaveChanges(int)

任何线索?

回答

1

您将需要在通用定义中使用实际的DbContext而不是DbContext基类。那么你就可以打电话给你的重写功能

public class RepositoryBase<C> : IDisposable 
     where C : YourContextClassGoesHere, new() 

{ 
    private C _dataContext; 

    public void SaveChanges() 
    { 
     int userId = GetUserId(); 
     _dataContext.SaveChanges(userId); 
    } 
}