0

我想在我的 ASP.NET MVC + EF 4.3 项目中实现存储库模式。

现在我的DBContext班级有一个覆盖SaveChanges接收“userid”参数以便进行审计跟踪。

例子:

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

我的问题是如何SaveChanges(int)在课堂上公开该方法RepositoryBase

有什么线索吗?

4

1 回答 1

1

您将需要在通用定义中使用实际的 DbContext 而不是 DbContext 基类。然后你就可以调用你的覆盖函数

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

{
    private C _dataContext;

    public void SaveChanges()
    {
        int userId = GetUserId();
       _dataContext.SaveChanges(userId);
    }
}
于 2012-08-09T00:00:14.713 回答