通用存储库,EF5,AutoFac和对象无法删除,因为它在ObjectStateManager中找不到

时间:2017-11-12 00:15:29

标签: c# asp.net-mvc-5 entity-framework-5

我有一个通用的存储库,它实现了它的通用接口,我试图删除我的localDB(MSSQL)上的实体。

这是通用存储库(和删除方法):

public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class
    {
        private readonly ABMContext _Context;
        private DbSet<TEntity> _Set;

        public GenericRepository(
            ABMContext dbcontext
            )
        {
            _Context = dbcontext;

            _Set = dbcontext.Set<TEntity>();          
        }

        public void Delete(TEntity entity)
        {
            _Set.Remove(entity);
            _Context.SaveChanges();
        }
        public TEntity FindBy(Expression<Func<TEntity, bool>> predicate)
        {
            TEntity query = _Context.Set<TEntity>()
                .Where(predicate)
                .AsNoTracking().FirstOrDefault();

            return query;
        }  
     }

界面

 public interface IGenericRepository<TEntity> where TEntity : class
    {
         void Delete(TEntity entity);
         TEntity FindBy(Expression<Func<TEntity, bool>> predicate);
    }

我以这种方式实现界面:

    public class Prog_II_ModelFactory : IProg_II_ModelFactory
    {
        private readonly IGenericRepository<Alumnos> _AlumnosRepository;

        public Prog_II_ModelFactory(
        IGenericRepository<Alumnos> alumnosRepository
        )
        {
             _AlumnosRepository = alumnosRepository;
        }
        public void DeleteAlumno(int dni)
        {
            Alumnos alumnoToDelete = _AlumnosRepository
                .FindBy(x => x.Dni == dni);

            _AlumnosRepository.Delete(alumnoToDelete); 
        }
     }

这就是我用Autofac绑定它的方式:

    builder
        .RegisterType<ABMContext>()
        .AsSelf().InstancePerLifetimeScope();

    builder
        .RegisterGeneric(typeof(GenericRepository<>))
        .As(typeof(IGenericRepository<>));

    builder
        .RegisterType<Prog_II_ModelFactory>()
        .As<IProg_II_ModelFactory>()
        .InstancePerLifetimeScope();

1 个答案:

答案 0 :(得分:1)

您的实体必须在Remove工作的上下文中进行跟踪,您的FindByAsNoTracking()

因此,请不要使用FindBy并以Delete替代方式接受Id作为参数,然后在方法中执行Find除去。