使用ChangeTracker的EF存储库模式

时间:2012-08-08 23:21:19

标签: asp.net-mvc entity-framework interface repository-pattern

我想在我的ASP.NET MVC + EF 4.3项目中实现Repository Pattern。

现在我的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方法?

有任何线索吗?

1 个答案:

答案 0 :(得分:1)

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

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

{
    private C _dataContext;

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