0

ASP.NET MVC + EF 4.3 プロジェクトにリポジトリ パターンを実装したいと考えています。

現在、私のクラスには、監査証跡を行うために「userid」パラメーターを受け取るDBContextオーバーライドがあります。SaveChanges

例:

  // 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 に答える