Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 基于Web API的带Autofac的EF依赖项注入_Entity Framework_Asp.net Web Api_Dependency Injection_Autofac - Fatal编程技术网

Entity framework 基于Web API的带Autofac的EF依赖项注入

Entity framework 基于Web API的带Autofac的EF依赖项注入,entity-framework,asp.net-web-api,dependency-injection,autofac,Entity Framework,Asp.net Web Api,Dependency Injection,Autofac,在DbContext中保存实体时,我有一个动态注入的内务管理服务 protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items) { var t = entityEntry.Entity.GetType(); // Housekeep var castEntityEntry = ca

在DbContext中保存实体时,我有一个动态注入的内务管理服务

protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
{
    var t = entityEntry.Entity.GetType();

    // Housekeep
    var castEntityEntry = castDbEntityEntryMethod
        .MakeGenericMethod(new[] { t })
        .Invoke(entityEntry, null);
    housekeepEntityMethod
        .MakeGenericMethod(new[] { t })
        .Invoke(this, new[] { castEntityEntry });

    return base.ValidateEntity(entityEntry, items);
}

private void HousekeepEntity<TEntity>(DbEntityEntry<TEntity> entity)
    where TEntity : class
{
    var housekeeper = DbConfiguration.DependencyResolver.GetService<IHousekeeper<TEntity>>();
    if (housekeeper != null)
    {
        housekeeper.Maintain(entity);
    }
}
设置容器时:

System.Data.Entity.DbConfiguration.Loaded += (s, e) =>
    e.AddDependencyResolver(new AutofacDbDependencyResolver(container), overrideConfigFile: false);
但是,我的生存范围返回null。如何获取调用此操作的当前API请求?

禁止在DbContext中使用。EF6现在是否允许您解决它并不重要,它仍然是一种反模式。相反,只需使用依赖项注入或通过挂接到事件来添加此内务管理。例如,可以为实体编写分部类:

public partial class MyEntities
{
    public event Action<DbContext> SavingChanges = _ => { };

    public override int SaveChanges()
    {
        this.SavingChanges(this);

        return base.SaveChanges();
    }
}

@蒂姆:是的,
DbContext
是工作单元模式的实现。
public partial class MyEntities
{
    public event Action<DbContext> SavingChanges = _ => { };

    public override int SaveChanges()
    {
        this.SavingChanges(this);

        return base.SaveChanges();
    }
}
builder.Register<MyEntities>(context =>
{
    var db = new MyEntities();
    db.SavingChanges += context.Resolve<IHouseKeepingService>().HousekeepEntities;
    return db;
}).InstancePerLifetimeScope();