我有一个自定义dbcontext,其名称是启用了跟踪器的DbContext(https://github.com/bilal-fazlani/tracker-enabled-dbcontext)。我想将它用于审计日志
我该如何实现EFRepository?
我实现了启用跟踪器的上下文,但我无法解决如何覆盖锐利的repo commit方法。
public class HayEntities : TrackerContext
{
static HayEntities()
{
Database.SetInitializer<HayEntities>(null);
}
public HayEntities() : base(HayEntities)
{
this.Configuration.ProxyCreationEnabled = false;
this.Configuration.LazyLoadingEnabled = true;
this.Configuration.ValidateOnSaveEnabled = false;
}
public DbSet<Dummy> Dummys{ get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new DummyConfiguration());
} }
}
public class DummyRepository : ConfigurationBasedRepository<DE.Dummy, long>, IDummyRepository
{
private readonly IRepository<DE.Dummy, long> _servisHasarRepository;
public DummyRepository (HayEntities hayEntities, ICachingStrategy<DE.Dummy, long> cachingStrategy = null)
{this.CachingEnabled = false;
_dummyRepository = new EfRepository<DE.Dummy, long>(hayEntities, cachingStrategy);
}
public void UpdateOrCreate() {
//In this area how can override save/commit method
}
}
答案 0 :(得分:0)
您需要告诉SharpRepository使用IoC提供程序注入DbContext。这将负责为您的EfRepository获取正确的DbContext。
如果您想根据配置控制事物并拥有自定义存储库,那么您可以实现自己的方法,如UpdateOrCreate(),那么您将继承ConfigurationBasedRepository,就像您在示例中一样。
有关使用SharpRepository设置IoC的更多详细信息:http://fairwaytech.com/2013/02/sharprepository-configuration/(请参阅“实体框架并共享DbContext”部分)
首先查看NuGet for SharpRepository.Ioc。*以查找您正在使用的特定IoC。如果你正在使用StructureMap,那么你会做这样的事情。
在StructureMap配置中:
// Hybrid (once per thread or ASP.NET request if you’re in a web application)
For<DbContext>()
.HybridHttpOrThreadLocalScoped()
.Use<HayEntities>()
.Ctor<string>("connectionString").Is(entityConnectionString);
然后你需要通过在启动代码中调用它来告诉SharpRepository使用StructureMap:
RepositoryDependencyResolver.SetDependencyResolver(new StructureMapDependencyResolver(ObjectFactory.Container));
完成这些操作后,如果您使用EfRepository,那么它会知道向StructureMap询问DbContext。
现在在您上面使用ConfigurationBasedRepository的示例中,我建议在配置文件而不是代码中设置缓存,因为您使用配置来加载存储库。由于IoC正在处理DbContext,因此您不需要对其进行任何操作,您可以专注于要编写的自定义方法。
public class DummyRepository : ConfigurationBasedRepository<DE.Dummy, long>, IDummyRepository
{
public void UpdateOrCreate()
{
// You have access to the underlying IRepository<> which is going to be an EfRepository in your case assuming you did that in the config file
// here you can call Repository.Add(), or Reposiory.Find(), etc.
}
}