我有一个通用的存储库,它实现了它的通用接口,我试图删除我的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();
答案 0 :(得分:1)
您的实体必须在Remove
工作的上下文中进行跟踪,您的FindBy
已AsNoTracking()
。
因此,请不要使用FindBy
并以Delete
替代方式接受Id
作为参数,然后在方法中执行Find
除去。