无法访问存储库以获取 visual studio MVC 中的对象

Can't access repository to get object in visual studio MVC

在控制器中,我试图获得 "Grade",使用:

 Grade g = gradeRepository.FindById(1);

findById 在 GradeRepository 中声明:

public class GradeRepository : IGradeRepository
{
private ProjectContext context;
private DbSet<Grade> grades;

public GradeRepository(ProjectContext context)
{
    this.context = context;
    grades = context.Grades;
}

public IQueryable<Grade> FindAll()
{
    return grades.OrderBy(g => g.name);
}

public Grade FindById(int gradeId)
{
    return grades.Include(l => l.DeterminateTableProp).FirstOrDefault(g => g.GradeInt == gradeId);
}

public void Remove(Grade grade)
{
    grades.Remove(grade);
}

public void SaveChanges()
{
    context.SaveChanges();
}


}

服务已在 nijectwebcommon 文件中正确注册:

private static void RegisterServices(IKernel kernel)
        {
            kernel.Bind<IContinentRepository>().To<ContinentRepository>().InRequestScope();
            kernel.Bind<IGradeRepository>().To<GradeRepository>().InRequestScope();
            kernel.Bind<ProjectContext>().ToSelf().InSingletonScope();
        }

这可能是什么问题? 我正在做的与我正在使用的另一个存储库完全相同。

回答

检查 InnerException property of the TargetInvocationException 找出问题所在。

InnerException 的重要性

这就是您需要查看 InnerException 的原因。通过 reflection 调用了某些方法,也许是工厂方法。该方法抛出异常,并且该异常隐藏在 TargetInvocationExceptionInnerException 属性 中,因为反射调用方法异常会发生这种情况。他们躲起来了。因此,您需要检查 InnerException 以找出 真正 出了什么问题。

The intro and remarks on MSDN tell the story of TargetInvocationException 很好。

这可能是什么问题?

从你的代码来看,可能是反射调用了 GetConstructorForType 工厂方法,如果 Grade 缺少默认构造函数,它将抛出异常。

internal static ConstructorInfo GetConstructorForType(Type type)
{
    System.Diagnostics.Debug.Assert(type != null);
    ConstructorInfo ci = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, System.Type.EmptyTypes, null);
        if (null == ci)
        {
            ThrowConstructorNoParameterless(type);
        }
    return ci;
}