我想在我的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
方法?
有任何线索吗?
答案 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);
}
}